Простой блог на Django - часть 10. Создание страницы регистрации
Первым делом нам необходимо создать мини-приложение users, в котором будет храниться логика по регистрации пользователя. Сделать это можно с помощью команды:
python manage.py startapp users
Не забываем подключить вновь созданное приложение в переменной INSTALLED_APPS, а так же прописать маршруты. Что касается первого, то напомню, что это можно сделать в файле settings.py главного приложения; для маршрутов же создадим файл /users/urls.py и укажем в нём следущие правила:
from django.urls import path, reverse_lazy
from . import views urlpatterns = [ path("signup/", views.SignUp.as_view(success_url=reverse_lazy('index')), name="signup"), ]
По сути, мы здесь используем встроенную View функцию, в параметрах которой в качестве success_url мы передаём маршрут, на который будет перенаправлен пользователь после регистрации. Теперь осталось подключить этот файл в newapp/newapp/urls.py главного приложения:
path('auth/', include('users.urls')),
Объявление роутинга в таком формате, подразумевает что регистрация у нас будет находиться по следующему адресу http://адрес_сайта/auth/signup/
Теперь займёмся файлом views.py:
from django.views.generic import CreateView from django.urls import reverse_lazy from .forms import CreationForm class SignUp(CreateView): form_class = CreationForm success_url = reverse_lazy('index') template_name = 'signup.html'
Здесь мы класс SignUp наследуем от CreateView (это к вопросу о том, откуда чуть ранее взялась функция as_view) и переопределяем некоторые его переменные - класс для работы с формой и шаблон.
При работе с регистрацией мы будем использовать формы, а значит создадим соответствующий класс с необходимыми полями в файле newapp/users/forms.py:
from django import forms from django.contrib.auth.forms import UserCreationForm from django.contrib.auth import get_user_model
User = get_user_model() class CreationForm(UserCreationForm): email = forms.EmailField(required=True)
class Meta(UserCreationForm.Meta): model = User fields = ("first_name", "last_name", "username", "email")
Что касается шаблона signup.html, то он будет таким:
{% extends "index.html" %}
{% block title %}Зарегистрироваться{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-md-8 p-5">
<div class="card">
<div class="card-header">Зарегистрироваться</div>
<div class="card-body">
{% for error in form.errors.values %}
<div class="alert alert-danger" role="alert">
{{ error|escape }}
</div>
{% endfor %}
<form method="post" action="{% url 'signup' %}">
{% csrf_token %} {% for field in form %}
<div class="form-group row" aria-required={% if field.field.required %}"true"{% else %}"false"{% endif %}>
<label for="{{ field.id_for_label }}" class="col-md-4 col-form-label text-md-right">
{{ field.label }}
{% if field.field.required %}<span class="required">*</span>{% endif %}
</label>
<div class="col-md-6">
{{ field }}
{% if field.help_text %}
<small id="{{ field.id_for_label }}-help" class="form-text text-muted">{{ field.help_text|safe }}</small>
{% endif %}
</div>
</div>
{% endfor %}
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
Зарегистрироваться
</button>
</div>
</form>
</div><!-- card body -->
</div><!-- card -->
</div><!-- col -->
</div><!-- row -->
{% endblock %}
Теперь если перейти по адресу http://адрес_сайта/auth/signup/ и заполнить все необходимые поля, то пользователь будет зарегистрирован и его можно будет увидеть в админке на соответствующей странице.
Небольшое дополнение. В какой-то момент сайт перестал отдавать статический контент, ни с того ни с сего. Если у вас произошло подобное, то вам сможет помочь следующая настройка, которая указывает конкретную папку, в которой стоит искать статичные файлы (прописать её необходимо в файле settings.py):
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'newapp/static'),]
Всё изменения, которые мы произоводили в этой заметке, можно посмотреть в коммите https://github.com/maclen2007/simple_django_blog/commit/7a893c6dfade5c6518f40e19eb3b0062699bd817
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()