Django 5 для начинающих

Прогресс по курсу:  9/1004

7.2 Использование системы аутентификации Django
4 из 7 шагов пройдено
0 из 11 баллов  получено

Приложение для пользователей

Поскольку мы создаем собственное представление и URL-адрес для регистрации, нам нужно создать специальное приложение. Назовем его accounts:

python manage.py startapp accounts

Обязательно добавьте новое приложение в INSTALLED_APPS настройки в нашем django_project/settings.py файле:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig',
    'taggit',
    'django.contrib.sites',
    'django.contrib.sitemaps',
    'django.contrib.postgres',
    'accounts.apps.AccountsConfig',
]

Затем добавьте URL-адрес уровня проекта для приложения accounts над включенным приложением Django auth.

Django будет искать шаблоны URL-адресов сверху вниз, поэтому, когда он увидит маршрут URL-адреса http://127.0.0.1:8000/accounts/, то он будет следовать сначало в наше accounts приложение, и только потом в auth:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls', namespace='blog')),
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap'),
    path("accounts/", include("accounts.urls")),
    path("accounts/", include("django.contrib.auth.urls")),
]

Создайте новый urls файл в нашем accounts приложении и добавьте следующий код:

from django.urls import path
from .views import SignUpView

urlpatterns = [
    path("signup/", SignUpView.as_view(), name="signup"),
]

Теперь в views.py файл нашего приложения accounts добавим:

from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic


class SignUpView(generic.CreateView):
    form_class = UserCreationForm
    success_url = reverse_lazy("login")
    template_name = "registration/signup.html"

Мы создаем подкласс общего представления CreateView на основе классов в нашем SignUp классе.

Мы указываем использование встроенного UserCreationForm и еще не созданного шаблона в signup.html.

И мы используем reverse_lazy для перенаправления пользователя на login-страницу при успешной регистрации.

Создайте новый шаблон templates/registration/signup.html и заполните его этим кодом, который выглядит почти точно так же, как мы использовали для login.html:

{% extends "blog/base.html" %}
{% block title %} Sign Up {% endblock %}
{% block content %}
    <h2> Sign Up </h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}

        <p><input type="submit" value="Sign Up"></p>
    </form>
{% endblock %}

Чтобы убедиться, что все работает, запустите наш локальный сервер с помощью команды:

python manage.py runserver

И перейдите к http://127.0.0.1:8000/accounts/signup/:

Дополнительный текст с подсказками по именам пользователей и паролям исходит от Django. Мы также можем настроить это, но это требует немного больше работы и выходит за рамки этого урока.

Заполните необходимые поля и нажмите кнопку SIGN UP. Вы будете перенаправлены на страницу входа http://127.0.0.1:8000/accounts/login/, где вы сможете войти в свою новую учетную запись.

А затем, после успешного входа в систему, вы будете перенаправлены на домашнюю страницу с персонализированным приветствием:

Перейдя в админ панель, мы тоже видим нашего пользователя:


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Файл views заполняем так же в accounts, я сперва в blog написал и у меня SignUpView не отображался

@Дмитрий_Чекмасов, добавил это уточнение в лекцию.

На моменте когда проверяем работу регистрации

Два раза переделывал, так и не понял, что делаю не так

@Кирилл_Смирнов, в файле mysite/urls.py измените 

path("account/", include("accounts.urls")),

на 

path("accounts/", include("accounts.urls")),

При редактировании данного материала кудато буква пропала(( 

@Илья_Перминов, понял, спасибо
ЗАРАБОТАЛО!) Знал, где искать, но сам не смог(
Такой еще момент чисто имхо
Можете ссылки не выделять вот так:

Потому что без такого оформления можно сразу по ссылке перейти и проверить работоспособность. А так: надо выделить, вставить, перейти
P.S в любом случае спасибо)

@Кирилл_Смирнов, Хорошо, думаю в ближайшее время поправим.

@Кирилл_Смирнов, спасибо, поправил.

При желании можно заменить  {{ form.as_p }} на это:

<div>{{ form.non_field_errors }}</div>
{% for f in form %}
    <p ><label>{{f.label}}: </label>{{ f }}</p>
    <div>{{ f.errors }}</div>
{% endfor 

{{ form.non_field_errors }} - блок для вывода ошибок валидации, не связанных с заполнением того или иного поля.

{{f.label}}  - название поля

{{ f.errors }}  - список ошибок для поля.

Как работает функция reverse_lazy и чем отличается от reverse?

@Александр_Ёлшин, это ленивая функция, возвращает значение в момент обращения к данным.

'accounts.apps.AccountsConfig' а почему мы добавили приложение так, а не просто 'accounts'

@Шамбер_Егор, приложение blog было добавлено точно так-же, с указанием точного пути до конфигурационного класса приложения. В данном случае оба варианта одинаковы.

правильно ли я понимаю, мы передаем в шаблон форму form_class и в шаблоне обращаемся к этой переменной по имени {{ form.as_p }} ?
До этого мы передавали в словаре переменные в шаблон из представления, и названия не менялись

​​​​​​​class SignUpView(generic.CreateView): 
form_class = UserCreationForm 
success_url = reverse_lazy("login") 
template_name = "registration/signup.html"

@Никита_Ильин, При работе на классах, у формы переменная по дефолту {{ form }}. Можете посмотреть примеры в документации.