Создание регистрации на сайте Django нередко вызывает проблему у новичков, которые недавно приступили к изучению Django. Рассмотрим наиболее простой способ создания регистрации на основе базового класса FormView и распространенные ошибки.
Регистрация - это процесс сообщений сайту своих данных для получения доступа к полному функционалу сайта.
Идентификация - это заявление о том кем вы являетесь. В зависимости от ситуации, это может быть имя, адрес электронной почты, номер учетной записи, и т.д.
Аутентификация - представление доказательств, что вы на самом деле есть тот, кем идентифицировались.
Авторизация - проверка, что вам разрешен доступ к запрашиваемому ресурсу.
Регистрацию в Django можно сделать ее стандартным или штатным способом (из коробки) то есть импортировав из ядра Django класс UserCreationForm, который нам предоставит возможность использовать базовый функционал для регистрации. А именно введение логина, пароля и повторение пароля. Так же в этот класс входит обработка ошибок, которые могут возникнуть с данными полями.
Но есть и другой вариант, чтобы реализовать регистрацию на сайте, это использовать готовые модули, такие как: "Джанго регистрация" (django-registration 2.2) , " Джанго-регистрация-Redux" (django-registration-redux), "Джанго-allauth" (django-allauth). Эти приложения сделают регистрацию очень легкой, также интегрированы с аутентификацией, управлением аккаунтом, аутентификацией в социальной сети и т.д.
Я не сторонник использовать дополнительные модули для Django и буду описывать нормальный , стандартный способ регистрации по ряду причин, а именно:
Итак, приступим. Будем использовать встроенную User (пользовательскую) модель Django. (см. документацию Django: django.contrib.auth
)
Создадим свое представление для регистрации пользователей на сайте при помощи класса Django - FormView.
Представление это программный код или функция, которые умолчанию распологаются в файле views.py.
Для редактирования контента на сайте в Django существует четыре базовых класса (см. документацию Django: Generic editing views):
Можно и не использовать вышеуказанные классы и написать свое представление (функцию обработки) для создания пользователя (def ...(request):), но мы это сделаем позже.
А сейчас, мы будем использовать вышеуказанный базовый класс FormView.
Так же, будем использовать встроенную форму Django, которая позволяет не писать формы (см. документацию Django: Creating forms from models) для этой функции (обычно расположенные в forms.py), расположенную в django.contrib.auth.forms основанную на классе UserCreationForm (для создания нового пользователя).
Модель формы данного класса включает в себя три поля из пользовательской модели:
Класс проверяет password1 и password2 на совпадение, проверяет пароль с помощью validate_password() и устанавливает пароль пользователя с помощью set_password(). (см. документацию Django: Using the Django authentication system). Хотя нам ничего не мешает сделать и свою форму на основании класса UserCreationForm и добавить например обработку других полей, например e-mail и т.д.
blog/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class MyForm(UserCreationForm):
email = forms.EmailField(max_length=200, help_text='Required')
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
В дальнейшем мы рассмотрим расширение существующей User модели, чтобы можно было добавлять свои (кастомные) поля, например адрес пользователя и т.д.. Но сейчас пока тоже это пропустим.(см. документацию Django: Customizing authentication in Django)
Создадим наше представление MyRegisterFormView (имя представления вы можете задать свое) . В этом классе есть три параметра которые нам предоставляет класс FormView:
Наш MyRegistraterFormView унаследован от класса FormView. Класс FormView мы подключаем при помощи from django.views.generic.edit . UserCreationForm - это стандартный класс, который предоставляет нам django из своей коробки - это простая форма регистрации.
views.py
from django.contrib.auth.forms import UserCreationForm
from django.views.generic.edit import FormView
# Вариант регистрации на базе класса FormView
class MyRegisterFormView(FormView):
# Указажем какую форму мы будем использовать для регистрации наших пользователей, в нашем случае
# это UserCreationForm - стандартный класс Django унаследованный
form_class = UserCreationForm
# Ссылка, на которую будет перенаправляться пользователь в случае успешной регистрации.
# В данном случае указана ссылка на страницу входа для зарегистрированных пользователей.
success_url = "/login/"
# Шаблон, который будет использоваться при отображении представления.
template_name = "register.html"
def form_valid(self, form):
form.save()
# Функция super( тип [ , объект или тип ] )
# Возвратите объект прокси, который делегирует вызовы метода родительскому или родственному классу типа .
return super(MyRegisterFormView, self).form_valid(form)
def form_invalid(self, form):
return super(MyRegisterFormView, self).form_invalid(form)
register.html :
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Зарегистрировать">
</form>
Eсли <form action="" это означает что обработка формы происходит на этой же странице по текущему адресу url. method="post" используется для отправки данных на сервер.
И не забываем прикрепить обязательный {% csrf_token %}. В любом шаблоне, который использует форму POST, используйте csrf_token тег внутри <form>элемента, если форма предназначена для внутреннего URL. Этого не следует делать для форм POST, предназначенных для внешних URL-адресов, так как это может привести к утечке токена CSRF, что приведет к уязвимости.
Сайт создает уникальный токен, когда он создает страницу формы. Этот токен необходим для отправки/получения данных обратно на сервер.
Поскольку токен генерируется вашим сайтом и предоставляется только тогда, когда создается страница с формой, некоторые другие сайты не могут имитировать ваши формы - у них не будет токена, и поэтому он не может публиковать, сделать действительный запрос на вашем сайте, , потому что запросы с неправильным токеном (или без токена) будут отклоняться.
И теперь самое интересное!:) При создании набора шаблонов в urls.py новички часто делают ошибку, копируя из инернета примеры, которые не работают - с ошибками... Например:
Джанго. Создание регистрационной формы. не может импортировать имя 'views'
Создание формы регистрации. Ошибка «Сannot import name ‘views’»
ВСем привет, помогите разобраться. Когда набираю , mysite/registr/ форма открывается и всё работает, но когда захожу на главную страницу и там ссылка на регистрацию выдается ошибка:Reverse for ‘views.register1’ with arguments ‘()’ and keyword arguments ‘{}’ not found. 0 pattern(s) tried:
Пример с ошибкой в статье:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
...
url(r'^register/$', views.RegisterFormView.as_view()),
...
)
Ошибка в строке:
url(r'^register/$', views.RegisterFormView.as_view()),
нужно писать:
url(r'^register/$', RegisterFormView.as_view()),
Мы сделаем правильно:
urls.py
from django.urls import path,
urlpatterns = [
...
path('accounts/register/', MyRegisterFormView.as_view(), name="register"),
...
]
Материалы по теме