• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Django, formularz rejestracji

Object Storage Arubacloud
0 głosów
1,634 wizyt
pytanie zadane 19 października 2018 w Python przez Sheida Użytkownik (950 p.)

Witam. W projekcie django posiadam swój model użytkownika. Chciałbym stworzyć formularz, którego używałbym podczas rejestracji użytkownika. Mam 2 problemy, otóż:

1. Podczas rejestracji formularz sprawdzając poprawność przesłanych danych nie sprawdza, czy password i password1 są identyczne.

2. Formularz powinien przyjmować jeszcze wartość ze znaczników include typu radio. Jak mogę sprawdzić, które pole jest zaznaczone?

 

Mój kod:

klasa User:

class User(AbstractUser):
    buisness = models.BooleanField(default=True)

funkcja register z pliku views:

    def register(request):
        if request.method == 'POST':
            user_form = UserForm(request.POST)
            if user_form.is_valid():
                if request.POST['password'] == request.POST['password2']:
                    user = user_form.save(commit=False)
                    user.password = request.POST['password']
                    user.save()
                    return redirect('login')
                return redirect('register')
        else:
            template = loader.get_template('register/index.htm')
            return HttpResponse(template.render({'user_form': UserForm()}, request))

kod HTML dokumentu rejestracji:

<html lang="pl" xmlns="http://www.w3.org/1999/html">
<head>
  <meta charset="utf-8">
  <meta name="author" content="Maciej Wrzeszcz">
  <title> Zarejestruj się </title>
  {% load static %}
  <link rel="stylesheet" href="{% static 'register/stylesheet.css' %}" type="text/css">
  <link href="https://fonts.googleapis.com/css?family=Titillium+Web:400,700&amp;subset=latin-ext" rel="stylesheet">

</head>
<body>
  <div id="content">
    <div id="header">
      Zarejestruj się na freelancer.com
    </div>
    <div id="register">
      <div id="fields">
        <form method="post"> {% csrf_token %}
          <div id="space" style="margin-top: 20px;"></div>
          <input type="text" name="username" placeholder="Nazwa użytkownika"><div id="space"></div>
          <input type="email" name="email" placeholder="E-mail"><div id="space"></div>
          <input type="password" name="password" placeholder="Hasło"><div id="space"></div>
          <input type="password" name="password2" placeholder="Powtórz hasło"><div id="space"></div>
          <input type="radio" name="buisness" /> Osoba prywatna
          <input type="radio" name="buisness" /> Firma <div id="space"></div>
          <input type="submit" value="Zarejestruj się"/>
        </form>
        <a href="{% url 'login' %}">
          <div id="log_in">
             Posiadasz konto?
          </div>
        </a>
      </div>
    </div>
  </div>

</body>
</html>

 

2 odpowiedzi

+2 głosów
odpowiedź 20 października 2018 przez izonik Stary wyjadacz (12,560 p.)
wybrane 20 października 2018 przez Sheida
 
Najlepsza

Na samy początku. Słowo "buisness" (chyba!) nie istnieje w angielskim, ale jest za to "business".

Django dostarcza na gotowy mechanizm do tworzenia forumlarzy, więc nie ma sensu budowania ich samodzielnie w kodzie html. Dodatkowo wbudowany w Django system autoryzacji dostarcza nam gotowy formularz przystosowany do tworzenia nowego usera. Jednak w twoim przypadku konieczne będzie utworzenie nowego formularza, dziedziczącego z wspomnianego wcześniej formularza (ponieważ rozszerzyłeś model użytkownika o nowe pola).

Nie napisałeś której wersji Django używasz, więc to co przedstawię powinno działać w wersjach powyżej 2.0

 

Na początku tworzymy plik forms.py (tak powielam twój ewentualny błąd w pisowni, ale tobie polecam zmienić nazwę tego pola)

from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import User


class RegisterForm(UserCreationForm):
    username = forms.CharField(
        max_length=100,
        label="Nazwa użytkownika",
        widget=forms.TextInput(
            attrs={
                "class": "example-html-class",
                "placeholder": "Nazwa użytkownika"
            }
        )
    )  # It's a example extend field. You can do it for all field .

    class Meta:
        model = User
        fields = [
            "username",
            "password1",
            "password2",
            "buisness",
        ]

Teraz tworzymy widok.

from django.shortcuts import redirect
from .forms import RegisterForm
from django.views.generic import CreateView
from django.contrib.auth import login, authenticate


class Register(CreateView):
    form_class = RegisterForm
    template_name = "account/register.html"

    def form_valid(self, form):
        form.save()

        user = authenticate(username=form.cleaned_data.get("username"),
                            password=form.cleaned_data.get("password1"))
        login(self.request, user)

        return redirect("/account/profile/")

I na końcu czas na templateke.

    <form method="post" action=".">
            {{ form.as_p }}
            {% csrf_token %}
            <input type="submit" value="Submit">
    </form>

Jeżeli coś nie działa, to napisz. Nie testowałem tego. Ale powinno działać.

Pozdrawiam.

komentarz 20 października 2018 przez Sheida Użytkownik (950 p.)
Dziękuję bardzo, otworzyłeś mi oczy na tworzenie nowych, lepszych formularzy. Czy w razie problemów mógłbym napisać prywtaną wiadomość do Ciebie?
komentarz 21 października 2018 przez izonik Stary wyjadacz (12,560 p.)
Nie mam nic przeciwko wiadomościom prywatnych, ale jeżeli chciałbyś zapytać o coś co może przydać się innym to lepiej użyć forum.
0 głosów
odpowiedź 19 października 2018 przez adrian17 Ekspert (346,840 p.)
Osobiście tego nie robiłem, ale z tego co wiem to standardowym sposobem jest ustawienie `AUTH_USER_MODEL`. Wydaje mi się, że wtedy wbudowane widoki typu LoginView, CreateView etc  powinny działać out of the box.

Co do sprawdzania poprawności formularza (równość haseł), lepszym miejscem byłoby przeładowanie `.clean()` formularza - wtedy będzie to częścią `is_valid()`.

Co do części 2, wbudowane widoki typu CreateView potrafią same stworzyć odpowiednie pola formularza na podstawie modelu.

Podobne pytania

0 głosów
1 odpowiedź 109 wizyt
pytanie zadane 2 czerwca 2020 w Python przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 341 wizyt
0 głosów
1 odpowiedź 883 wizyt
pytanie zadane 14 października 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)

92,757 zapytań

141,679 odpowiedzi

320,437 komentarzy

62,101 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...