Давайте изменим наш класс в views.py, а именно изменим представление SignUpView:
from django.urls import reverse_lazy
from django.views import generic
from .forms import SignUpForm
from django.shortcuts import render, redirect
from django.contrib import messages
class SignUpView(generic.CreateView):
form_class = SignUpForm
success_url = reverse_lazy("login")
initial = None # принимает {'key': 'value'}
template_name = 'registration/signup.html'
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for {username}')
return redirect(to='/')
return render(request, self.template_name, {'form': form})
Что мы изменили?
- Если GET-запрос получен, он создает новый экземпляр пустой формы. Через метод
initialмы можем передать словарь с ключами - именами полей и значениями - начальными значениями полей формы. Мы данный метод не используем, но нужно понимать что он существует и как он работает.
Например: добавивinitial = {'first_name': 'Test'}у нас автоматически при переходе на страницу регистрации в полеFirst nameбудет введено значениеTest.
- Если запрос представляет собой POST, то создается новый экземпляр формы с данными публикации.
- Затем проверяет, действительна ли форма, вызывая
form.is_valid()метод.
- Если форма действительна, обрабатываем и сохраняем пользователя в нашей базе данных.
- Чтобы сообщить пользователю, что его/ее учетная запись успешно создана, мы можем сгенерировать сообщение и отобразить приветствие и его имя пользователя на странице, на которую он перенаправляется (домашняя страница) при помощи модального окна.
Чтобы передать сообщение, мы используем встроенный механизм сообщений в Django. Для этого мы подключаем его from django.contrib import messages и после у нас появляется функционал сообщений:
messages.debug(request, "%s SQL statements were executed." % count)
messages.info(request, "Three credits remain in your account.")
messages.success(request, "Profile details updated.")
messages.warning(request, "Your account expires in three days.")
messages.error(request, "Document deleted.")
Каждый вид использует свой тег (которые обычно представлены в виде HTML-классов для сообщения). Мы используем тег success.
В качестве примера, добавим данный код в наш базовый шаблон /templates/blog/base.html после <div id="content">:
{% if messages %}
{% for message in messages %}
{{ message.tags }} {{ message }}
{% endfor %}
{% endif %}
После успешной регистрации мы увидим:
Мы видим тег о том что регистрация выполнена и текст приветствия из views.py в строке messages.success(request, f'Account created for {username}'):
Это все, что касается страницы регистрации. Теперь посмотрим, все ли работает:
- Запустите сервер разработки командой
python manage.py runserver.
- Перейдите на http://127.0.0.1:8000/accounts/signup/ и проверьте, все ли работает.
- Если вы пройдете проверку, вы должны быть перенаправлены на домашнюю страницу с сообщением.
- Перейдите в панель администратора, чтобы проверить, успешно ли Django создал пользователя.