Uživatelé

Ověřování uživatelů

Vytvoříme novou aplikaci users:

python manage.py startapp users

Do souboru settings.py doplním:

INSTALLED_APPS = [
    'flights',
    'users', # doplníme název aplikace
    'django.contrib.admin',
    ...
]

Do souboru airline\urls.py doplním:

    path('users/', include('users.urls')),

Vytvoříme soubor pro aplikaci users\urls.py

from django.urls import path

from . import views

urlpatterns = [
    path("", views.user, name="user"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout")
]

Upravíme soubor users\views.py:

from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse

# Create your views here.
def user(request):
    if not request.user.is_authenticated:
        return HttpResponseRedirect(reverse("login"))
    return render(request, "users/user.html")

def login_view(request):
    if request.method == "POST":
        username = request.POST["username"]
        password = request.POST["password"]
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return HttpResponseRedirect(reverse("user"))
        else:
            return render(request, "users/login.html", {
                "message": "Invalid credentials."
            })
    else:
        return render(request, "users/login.html")

def logout_view(request):
    logout(request)
    return render(request, "users/login.html", {
        "message": "Logged out."
    })

Vytvoříme šablony users\templates\users\layout.html, users\templates\users\login.html, users\templates\users\user.html.

Login

{% extends "users/layout.html" %}

{% block body %}

    <h1>Log In</h1>

    {% if message %}
        <div>{{ message }}</div>
    {% endif %}

    <form action="{% url 'login' %}" method="post">
        {% csrf_token %}
        <input type="text" name="username" placeholder="Username">
        <input type="password" name="password" placeholder="Password">
        <input type="submit" value="Login">
    </form>
{% endblock %}

User

{% extends "users/layout.html" %}

{% block body %}

    <h1>Welcome, {{ request.user.first_name }}</h1>

    <ul>
        <li>Username: {{ request.user.username }}</li>
        <li>Email: {{ request.user.email }}</li>
    </ul>

    <a href="{% url 'logout' %}">Log Out</a>
{% endblock %}

Registrace uživatele

Zdroj: https://dev.to/donesrom/how-to-set-up-django-built-in-registration-in-2023-41hg

Vytvoříme soubor s formulářem v rámci naší aplikace: formular.py

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

class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ["username", "first_name", "last_name","email", "password1", "password2"]

V souboru aplikace upravíme views.py

from . formular import *
from django.shortcuts import render, redirect # přidáme redirect
from django.contrib.auth.forms import *

def sign_up(request):
    if request.method == "POST":
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request,user)
            return redirect("/")
    else:
        form = RegistrationForm()
    
    return render(request, "users\sign_up.html", {
        "form":form
        })

Upravíme urls.py aplikace:

path("sign_up", views.sign_up, name="sign_up")

Vytvoříme šablonu: .\templates\aplikace\sign_up.html

{% extends "users/layout.html" %}

{% block body %}

<h3>Registrace uživatele</h3>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Sign up</button>
</form>

{% endblock %}

Kromě .as_p nabízí Django další vestavěné formáty:

Metoda HTML obal (Wrapper) Poznámka
{ form.as_div } <div> Nejmodernější přístup.
{ form.as_table } <tr> V šabloně přidejte tag <table>.
{ form.as_ul } <li> V šabloně přidejte tag <ul>.

Chceme-li ve formuláři češtinu upravíme settings.py

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'cs'

Nakonec můžete přidat bootstrap pro lepší vzhled webové aplikace. Buď klasicky nebo pomocí django-bootstrap5