Создание учетных записей пользователей
425
Страница регистрации
Теперь мы построим страницу для регистрации новых пользователей. Для этой
цели мы используем класс Django
UserCreationForm
, но напишем собственную
функцию представления и шаблон.
URL-адрес регистрации
Следующий код предоставляет шаблон URL для страницы регистрации — также
в файле
users/urls .py
:
urls.py
...
urlpatterns = [
# Страница входа
...
# Страница регистрации
url(r'^register/$', views.register, name='register'),
]
Шаблон соответствует URL http://localhost:8000/users/register/ и отправляет за-
просы функции
register()
, которую мы сейчас напишем.
Функция представления register()
Функция представления
register()
должна вывести пустую форму регистрации
при первом запросе страницы регистрации, а затем обрабатывает заполненную
форму регистрации при отправке данных. Если регистрация прошла успешно,
функция также должна выполнить вход для нового пользователя. Включите сле-
дующий код в
users/views .py
:
views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.forms import UserCreationForm
def logout_view(request):
...
def register(request):
"""Регистрирует нового пользователя."""
if request.method != 'POST':
# Display blank registration form.
form = UserCreationForm()
else:
# Обработка заполненной формы.
form = UserCreationForm(data=request.POST)
if form.is_valid():
new_user = form.save()
# Выполнение входа и перенаправление на домашнюю страницу.
426 Глава 19 • Учетные записи пользователей
authenticated_user = authenticate(username=new_user.username,
password=request.POST['password1'])
login(request, authenticated_user)
return HttpResponseRedirect(reverse('learning_logs:index'))
context = {'form': form}
return render(request, 'users/register.html', context)
Сначала импортируется функция
render()
, после чего импортируются функции
login()
и
authenticate()
для выполнения входа пользователя, если регистраци-
онная информация верна. Также импортируется класс
UserCreationForm
по умол-
чанию. В функции
register()
мы проверяем, отвечает ли функция на запрос
POST. Если нет, создается экземпляр
UserCreationForm
, не содержащий исходных
данных . В случае ответа на запрос POST создается экземпляр
UserCreationForm
,
основанный на отправленных данных . Мы проверяем, что данные верны ;
в данном случае что имя пользователя содержит правильные символы, пароли
совпадают, а пользователь не пытается вставить вредоносные конструкции в от-
правленные данные.
Если отправленные данные верны, мы вызываем метод
save()
формы для со-
хранения имени пользователя и хеша пароля в базе данных . Метод
save()
возвращает только что созданный объект пользователя, который сохраняется
в
new_user
.
После того как информация пользователя будет сохранена, мы выполняем вход;
этот процесс состоит из двух шагов: сначала вызывается функция
authenticate()
с аргументом
new_user.username
и паролем . При регистрации пользователю
предлагается ввести два совпадающих пароля; поскольку данные формы верны,
мы знаем, что пароли совпадают, и можем использовать любой из них. В данном
случае используется значение, связанное с ключом
'password1'
в данных POST
формы. Если имя пользователя и пароль верны, метод возвращает проверенный
объект пользователя, который сохраняется в
authenticated_user
. Затем вызывает-
ся функция
login()
с объектами
request
и
authenticated_user
, которая создает
действительный сеанс для нового пользователя.
Наконец, пользователь перенаправляется на домашнюю страницу
, где привет-
ствие в заголовке сообщает о том, что регистрация прошла успешно.
Шаблон регистрации
Шаблон страницы регистрации похож на шаблон страницы входа. Проследите
за тем, чтобы он был сохранен в одном каталоге с
login .html
:
register.html
{% extends "learning_logs/base.html" %}
{% block content %}
Создание учетных записей пользователей
427
{% endblock content %}
Мы снова используем метод
as_p
, чтобы инфраструктура Django могла правильно
отобразить все поля формы, включая все сообщения об ошибках, если форма была
заполнена неправильно.
Создание ссылки на страницу регистрации
Следующий шаг — добавление кода для вывода ссылки на страницу регистрации
для любого пользователя, еще не выполнившего вход:
base.html
...
{% if user.is_authenticated %}
Hello, {{ user.username }}.
log out
{% else %}
register -
log in
{% endif %}
...
Теперь пользователи, выполнившие вход, получат персональное приветствие
и ссылку для выхода. Другие пользователи видят ссылку на страницу регистрации
и ссылку для входа. Проверьте страницу регистрации, создав несколько учетных
записей с разными именами пользователей.
В следующем разделе доступ к некоторым страницам будет ограничен, чтобы
страницы были доступны только для зарегистрированных пользователей. Также
необходимо позаботиться о том, чтобы каждая тема принадлежала конкретному
пользователю.
Достарыңызбен бөлісу: