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

Django, formularz rejestracji

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,873 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 Mentor (352,580 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ź 162 wizyt
pytanie zadane 2 czerwca 2020 w Python przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 381 wizyt
0 głosów
1 odpowiedź 1,174 wizyt
pytanie zadane 14 października 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)

93,337 zapytań

142,332 odpowiedzi

322,423 komentarzy

62,676 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...