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

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

7.3 Доработки системы авторизации и регистрации, добавление сессий
3 из 4 шагов пройдено
0 из 5 баллов  получено

Давайте изменим наш класс в 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.
  • Если вы пройдете проверку, вы должны быть перенаправлены на домашнюю страницу с сообщением.
  • Перейдите в панель администратора, чтобы проверить, успешно ли Django создал пользователя.

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

Для чего создается и передается в form_class атрибут initial?

@Кислинский_Роман, На этапе написания лекции была идея установить начальные значения при регистрации, чтобы показать эту возможность в Django, но после не придумали куда. Сейчас изменили код в данной лекции и добавили описание этой функции.

Каждый вид использует свой тегаи (которые обычно представлены в виде HTML-классов для сообщения).

Ошибка в тексте

@Дмитрий_Харламов, спасибо, исправил.

текст приветствия из view.py 

@Anonymous_450292901, исправил, спасибо.

есть вопросы у меня так же, но запись о том что только что пользователь зарегался сдвинута в право, а так все тоже самое единственное когда мы создали аккаунт мы в него не вошли почему ? надо через почту подтвердить ? хотя по моему это не обязательно!


 

Изменен No Name

@No_Name, мы не добавляли функциональность автоматического входа после регистрации, подтверждение через почту тоже не нужно. Чтобы войти в аккаунт, нужно ввести логин и пароль на странице авторизации.

@Илья_Перминов, разобрался, спасибо за быстрее ответы.

В каком месте передается  messages, да еще и в базовый шаблон?

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})

@Никита_Ильин, Мы пишем вывод сообщений в базовый шаблон, чтобы потом в дальнейшем у нас у каждого шаблона была возможность вывода этих сообщений, в том числе и у registration/signup.html

А делаем мы так, потому что у профиля мы тоже будем использовать вывод этих сообщений.

@Илья_Перминов, хорошо, а как в базовый шаблон попадает эта переменная?

@Никита_Ильин, Шаблон регистрации наследуется(расширяется) от базового шаблона. 

{% extends "blog/base.html" %}

@Илья_Перминов, видимо я как-то неправильно пишу, это понятно.
Не понятен механизм передачи этого аргумента. До этого мы вот так передавили переменные в шаблон
 

return render(request,
                  'blog/post/search.html',
                  {'form': form,
                   'query': query,
                   'results': results})

и затем могли их использовать так, пример для results

{% for post in results %}

А тут  мы имеем вот этот код 

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})

а потом использование переменной в базовом шаблоне 
вот так.

 {% if messages %}

Вопрос как она туда попала, если мы явно не указывали это. В какой строке магия?

Изменен Никита Ильин

@Никита_Ильин, Вот сейчас полностью понял вас. Мы в коде подключаем 

from django.contrib import messages

Это встроенная система сообщений в Django, она работает под капотом, и имеет следующие виды сообщений:

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.")

Можете посмотреть в документации

@Никита_Ильин, Добавили немного информации об этом в лекцию.

@Илья_Перминов, теперь все ясно