Registracija sa email-om
Napravi formu RegistracijaForma koja nasleđuje UserCreationForm i dodaje obavezno polje email, i koristi je u pogledu umesto UserCreationForm.
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.
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.
# 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 |
|---|---|
UserCreationForm | polja: 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.success | jednokratna poruka koju base.html prikaže na sledećoj strani |
{# 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.
/nalozi/registracija/ i pošalji praznu formu – pojaviće se greške na srpskom (zbog LANGUAGE_CODE).12345678 – Django je odbija kao previše čestu i samo numeričku./moji-logoi/ (ta strana nastaje u lekciji 8; do tada privremeno preusmeri na naslovna).pbkdf2_sha256$... – heš, ne prava lozinka.Za svaki zadatak postoji primer, uputstvo i rešenje.
Napravi formu RegistracijaForma koja nasleđuje UserCreationForm i dodaje obavezno polje email, i koristi je u pogledu umesto UserCreationForm.
{% csrf_token %} POST forma vraća grešku 403 (CSRF verification failed).redirect, ne render.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?
| Unutar jednog projekta moguće je imati više modula(aplikacija unutar glavne aplikacije). Većina web aplikacija treba da svojim posetiocima treba da svojim posetiocima omogući registrovanje na sajt, kao i mogućnost prijavljivanja. To će u aplikaciji Logo Kreator biti poseban modul. U nastavku ćemo pokazati kako se kreiraju moduli, koji treba da budu posebni folder unutar root-a aplikacije. |
Dodavanje modula za registraciju-videoKreiranje aplikacije Logo Kreator upotrebom Đango Framework-a. Nastavak br. 6, koji opisuje kako dodati aplikaciju za registraciju korisnika |
Da bi url registracija:registrovanje koji se pojavljje kao href atribut linkova, a koji se najčešće nalaze u okviru templejta(html stranica), preusmerio na izvršavanje funkcije koja će renderovati web stranu za registraciju korisnika, potrebno je ovu vezu ubaciti unutar strane urls.py:
Ovde se prvo vrši provera da li je korisnik ulogovan(i da li postoji u bazi).
Vidi se da i ovaj html fajl proširuje base.html, kao i naslovna strana, a to je onaj zajednički deo u kome se nalaze gornje i donje zaglavlje. U centralnom delu strane se nalazi forma za regostraciju prikazana kao tabela. Takođe se nalazi i deo za prikaz poruka o grešci ukoliko do njih dođe kao i zaštitni tag csrf_token, koji služi za zaštitu od poziva webstrane sa neželjenih lokacija(hakera, spamova itd).| Prethodno |<Kreiranje aplikacije na Heroku Web Platformi 2 |
Sledeće Dodavanje web strane za logovanje>| |