Простая регистрация пользователей на сайте Django

Простая регистрация пользователей на сайте Django

Создание регистрации на сайте Django нередко вызывает проблему у новичков, которые недавно приступили к изучению Django. Рассмотрим наиболее простой способ создания регистрации на основе базового класса FormView и распространенные ошибки.

Регистрация - это процесс сообщений сайту своих данных для получения доступа к полному функционалу сайта.

Идентификация - это заявление о том кем вы являетесь. В зависимости от ситуации, это может быть имя, адрес электронной почты, номер учетной записи, и т.д.

Аутентификация - представление доказательств, что вы на самом деле есть тот, кем идентифицировались.

Авторизация - проверка, что вам разрешен доступ к запрашиваемому ресурсу.

Регистрацию в Django можно сделать ее стандартным или штатным способом (из коробки)  то есть импортировав из ядра Django класс UserCreationForm, который нам предоставит возможность использовать базовый функционал для регистрации. А именно введение логина, пароля и повторение пароля. Так же в этот класс входит обработка ошибок, которые могут возникнуть с данными полями. 
Но есть и другой вариант, чтобы реализовать регистрацию на сайте, это использовать готовые модули, такие как:  "Джанго регистрация"  (django-registration 2.2) ,  " Джанго-регистрация-Redux" (django-registration-redux),  "Джанго-allauth" (django-allauth). Эти приложения сделают регистрацию очень легкой, также интегрированы с аутентификацией, управлением аккаунтом, аутентификацией в социальной сети и т.д.

Я не сторонник использовать дополнительные модули для Django и буду описывать нормальный , стандартный способ регистрации по ряду причин, а именно:

  • готовые решения не способствуют самостоятельному изучению основ Django
  • разрабатывая функцианал сайта сомостоятельно, вы не зависите от предложенного функционала заложенного в коробке, тем самым позволяет сделать ваш сайт именно таким, каким вы его задумали и не усложнять себе жизнь  возникаемыми ограничениями, вопросами настройки и адаптации дополнительных модулей. К тому же не редко устанавливаемые модули тянут за собой порой  создание не нужных вам моделей (таблиц) и связей между ними.
  • Вы не будите зависить от различных релизов дополнительных модулей,  которые поддерживают или не поддерживают вышу используемую версию Python или Django.
  • у Вас есть возможность проявить свои способности , и  сделать программный код более компактным и производительным.

Итак, приступим. Будем использовать встроенную User (пользовательскую) модель Django. (см. документацию Django: django.contrib.auth)

Создадим свое представление для регистрации пользователей на сайте  при помощи класса Django - FormView.  
Представление это программный код или функция, которые умолчанию  распологаются в файле views.py. 

Для  редактирования контента на сайте в Django существует четыре базовых класса (см. документацию Django: Generic editing views):

  1. django.views.generic.edit.FormView (Представление, которое отображает форму. При ошибке повторно отображает форму с ошибками проверки; в случае успеха перенаправляет на новый URL.)
  2. django.views.generic.edit.CreateView (Представление, отображающее форму для создания объекта, повторного отображения формы с ошибками проверки (если они есть) и сохранения объекта.)
  3. django.views.generic.edit.UpdateView (Представление, отображающее форму для редактирования существующего объекта, повторного отображения формы с ошибками проверки (если они есть) и сохранения изменений в объекте. При этом используется форма, автоматически генерируемая из класса модели объекта (если класс формы не указан вручную).)
  4. django.views.generic.edit.DeleteView(Представление, которое отображает страницу подтверждения и удаляет существующий объект. Данный объект будет удален только если используется метод запроса POST. Если это представление получено через GET, оно отобразит страницу подтверждения, которая должна содержать форму, которая отправляет по тому же URL-адресу.)

Можно и не использовать вышеуказанные классы и написать свое представление (функцию обработки) для создания пользователя (def ...(request):), но мы это сделаем позже.

А сейчас, мы будем использовать вышеуказанный базовый класс FormView.

Так же,  будем использовать встроенную форму Django, которая позволяет не писать формы (см. документацию Django: Creating forms from models) для этой функции (обычно расположенные в forms.py), расположенную в django.contrib.auth.forms основанную на классе UserCreationForm (для создания нового пользователя).
Модель формы данного класса включает в себя три поля из пользовательской модели:

  • username
  • password1
  • password2 

Класс проверяет 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:

  • form_class (для указания какую форму мы будем использовать для регистрации наших пользователей, в нашем случае это UserCreationForm).
  • success_url  - срабатывает в случае успешной регистрации. За успшную регистрацию отвечает метод form_valid, который принимает self и form. Если валидация проходит успешно, мы эту форму сохраняем и вызываем метод базового класса form_valid
  • template_name - указывает на то, какой шаблон мы должны отобразить пользователю с нашей формой (например, "register.html")

Наш 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"),
    ...
]

 

Добавить комментарий

Материалы по теме