Django: registracija korisnika

Lekcija 6 od 9 · Python web: Django projekat

Korisnik koji želi da čuva logoe pravi nalog. Django već ima model korisnika, heširanje lozinki i gotovu formu za registraciju (UserCreationForm) – mi pišemo samo pogled, adresu i šablon u aplikaciji nalozi.

Pre nego što počneš: potrebno predznanje – modeli i baza, HTML forme.
Kako da učiš: radi u svom projektu korak po korak i posle svake lekcije proveri da li server radi; zadatak na kraju prvo uradi sam/a. Kod je za Django 5.2 (LTS) i Python 3.12+; svaki deo upiši u fajl naveden u komentaru na vrhu primera.

Kako radi forma u Django-u

GET  /nalozi/registracija/  → prazna forma
POST /nalozi/registracija/  → forma sa podacima
        │
        ├─ is_valid() = False → ista strana, sa porukama o greškama
        └─ is_valid() = True  → save() → login() → preusmerenje na /moji-logoi/

Isti obrazac (GET prikazuje, POST obrađuje, uspešan POST preusmerava) koristi se u svakoj Django formi. Preusmerenje posle POST-a sprečava da osvežavanje stranice ponovo pošalje formu.

Pogled i adresa

# nalozi/views.py
from django.contrib import messages
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import redirect, render


def registracija(request):
    if request.method == "POST":
        forma = UserCreationForm(request.POST)
        if forma.is_valid():
            korisnik = forma.save()                 # Django sam hešira lozinku
            login(request, korisnik)                # odmah ga i prijavi
            messages.success(request, f"Dobro došao/la, {korisnik.username}!")
            return redirect("moji_logoi")
    else:
        forma = UserCreationForm()
    return render(request, "nalozi/registracija.html", {"forma": forma})
# nalozi/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("registracija/", views.registracija, name="registracija"),
]

U glavnom urls.py odkomentariši red path("nalozi/", include("nalozi.urls")). Adresa registracije je /nalozi/registracija/.

DeoŠta radi
UserCreationFormpolja: korisničko ime, lozinka, ponovljena lozinka; proverava da li ime postoji, da li se lozinke poklapaju i da li je lozinka dovoljno jaka
forma.save()pravi korisnika; lozinka se čuva kao heš (PBKDF2 – isti postupak kao u lekciji Bezbednost)
login(request, korisnik)pravi sesiju – korisnik je odmah prijavljen
messages.successjednokratna poruka koju base.html prikaže na sledećoj strani

Šablon sa Bootstrap poljima

{# nalozi/templates/nalozi/registracija.html #}
{% extends "base.html" %}

{% block naslov %}Registracija – Logo Kreator{% endblock %}

{% block sadrzaj %}
<div class="container py-4" style="max-width: 480px">
  <h1 class="h3 mb-3">Registracija</h1>
  <form method="post" novalidate>
    {% csrf_token %}
    {% for polje in forma %}
      <div class="mb-3">
        <label for="{{ polje.id_for_label }}" class="form-label">{{ polje.label }}</label>
        <input type="{{ polje.field.widget.input_type }}" name="{{ polje.html_name }}" id="{{ polje.id_for_label }}"
               class="form-control{% if polje.errors %} is-invalid{% endif %}"
               {% if polje.field.widget.input_type != "password" %}value="{{ polje.value|default_if_none:'' }}"{% endif %}>
        {% for greska in polje.errors %}<div class="invalid-feedback">{{ greska }}</div>{% endfor %}
        {% if polje.help_text %}<div class="form-text">{{ polje.help_text|safe }}</div>{% endif %}
      </div>
    {% endfor %}
    <button class="btn btn-danger w-100">Napravi nalog</button>
  </form>
  <p class="mt-3 small">Već imaš nalog? <a href="{% url 'login' %}">Prijavi se</a>.</p>
</div>
{% endblock %}

Petlja {% for polje in forma %} ispisuje sva polja sa natpisom, greškama i pomoćnim tekstom (pravila za lozinku). Klasa is-invalid boji polje crveno kada ima grešku. Atribut novalidate isključuje proveru u pregledaču, da bi se videle poruke koje vraća Django – korisno dok učiš.

Brži način bez prilagođavanja izgleda: {{ forma.as_div }} umesto cele petlje.

Isprobaj

  1. Otvori /nalozi/registracija/ i pošalji praznu formu – pojaviće se greške na srpskom (zbog LANGUAGE_CODE).
  2. Probaj lozinku 12345678 – Django je odbija kao previše čestu i samo numeričku.
  3. Napravi nalog sa jakom lozinkom – bićeš preusmeren/a na /moji-logoi/ (ta strana nastaje u lekciji 8; do tada privremeno preusmeri na naslovna).
  4. U admin panelu pogledaj novog korisnika: lozinka se vidi samo kao pbkdf2_sha256$... – heš, ne prava lozinka.

Video: modul za registraciju

Napomena uz video: video je snimljen za prvu verziju projekta (starija verzija Django-a, Heroku). Ideje su iste, ali se kod iz ove lekcije razlikuje u detaljima – kada se razlikuju, važi kod sa ove strane.

Zadaci za vežbu

Za svaki zadatak postoji primer, uputstvo i rešenje.

ZADATAK 01Težina: srednje

Registracija sa email-om

Napravi formu RegistracijaForma koja nasleđuje UserCreationForm i dodaje obavezno polje email, i koristi je u pogledu umesto UserCreationForm.

Česte greške i saveti
  • Bez {% csrf_token %} POST forma vraća grešku 403 (CSRF verification failed).
  • Lozinke nikad ne čuvaj u svom modelu kao tekst – koristi Django-ov model korisnika.
  • Posle uspešnog POST-a uvek redirect, ne render.

Proveri znanje

Otvori kviz

Registracija

1. Šta Django čuva u bazi umesto lozinke?




2. Šta treba uraditi posle uspešno obrađene POST forme?



3. Koja oznaka mora biti u svakoj POST formi u Django šablonu?