Программы
Пользователи и авторизация (логин) в Django, кастомизация пользователя

Пользователи и авторизация (логин) в Django, кастомизация пользователя

В Django есть множество встроенных возможностей, которые позволяют не реализовывать многие классы для стандартных операций. Среди них - авторизация. Django изначально предоставляет пользовательскую систему. Но её можно использовать лучше, чем по умолчанию.

В предыдущей заметке об админ-панели Django мы уже познакомились с пользователями и авторизацией Django. Но это было довольно поверхностно и только в рамках админ-панели. Если же мы хотим добавить что-то своё в пользователей и авторизацию пользователей на сайте, нам нужно расширить уже имеющуюся систему необходимыми возможностями.

Заменяем стандартную Django модель для пользователей на свою

Для того, чтобы начать разработку своего кастомного пользователя, создадим приложение, которое будет за него отмечать -

$ python3 ./manage.py startapp user

После чего в нём создадим модель, которая будет отвечать за хранение и предоставление информации о пользователе - ./user/models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core.validators import validate_slug
from django.utils.translation import ugettext_lazy as _


class User(AbstractUser):
    username = models.CharField(
        verbose_name="Никнейм",
        max_length=150,
        unique=True,
        validators=[validate_slug],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )

    email = models.EmailField(verbose_name='E-mail', blank=True, unique=True, null=True)
    email_checked = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return '%s (%s)' % (self.get_full_name(), self.email)

Наследуемся от стандартного AbstractUser, добавляем необходимую валидацию, сообщения об ошибке и тд. Если нам не нужен email (а так тоже часто бывает) - делаем необязательными стандартные поля, ответственные за email.

Не забываем добавить в админку, как это делалось в этой заметке. А также зарегистрировать в конфигурационном файле ./application/settings.py:

INSTALLED_APPS = [
    ...
    'user.apps.UserConfig',
    ...
]


AUTH_USER_MODEL = 'user.User'

Первое - подгрузка самого приложения, второе - указываем, какая модель будет моделью в Django, отвечающей за пользователя. К слову, после этого регистрация нашего супер-юзера слетит (ибо уже другая модель). Придётся снова делать createsuperuser.

Добавляем логин на сайт Django

Чтобы наша моделька и в целом вся пользовательская система работала на всём сайте, а не только в админке, нам нужно сделать пару дополнительных правок. Модель у нас уже есть, но, как минимум, надо добавить url для приложения. Например, application/urls.py:

from django.urls import path, include

urlpatterns = [
    ...
    path('user/', include('user.urls', namespace='user')),
    ...
]

И в самом приложении - user/urls.py:

from django.urls import path
from .views import UserLoginView

app_name = 'user'

urlpatterns = [
    path(r'login/', UserLoginView.as_view(), name='login'),
]

Можете заметить, что здесь мы используем view для логина пользователя в Django. Давайте его определим, используя уже встроенный в django.contrib.auth:

from django.contrib.auth.views import LoginView

from .froms import LoginForm


class UserLoginView(LoginView):
    form_class = LoginForm
    template_name = 'user/login.html'

То есть достаточно указать шаблон для отображения и форму, которая будет принимать и валидировать данные с фронтенда. В частности, форму логина можно сделать с помощью стандартной в файле user/forms.py:

from django.contrib.auth.forms import AuthenticationForm


class LoginForm(AuthenticationForm):
    pass

По умолчанию используется username и password - достаточно хорошо для нас. Ну и сам шаблон формы user/templates/user/login.html:

{% extends  'layout/default.html' %}

{% block content %}
<div class="box">
    <h4 class="form-header">Вход в систему</h4>

    <form method="post">
        {% csrf_token %}
        <input type="hidden" name="next" value="{{ next }}">

        {{ form }}

        <button type="submit" class="btn btn-primary btn-block">Войти</button>
    </form>
</div>
{% endblock %}

После логина вы будете перенаправлены по адресу, указанному в application/settings.py:

LOGIN_URL = '/user/login/'
LOGIN_REDIRECT_URL = '/'

Первый url для тех, кто хочет авторизоваться, второй - для тех, кто только что вошёл.

Теперь мы можем авторизоваться с нашим пользователем, которого мы создали командой python ./manage.py createsuperuser, как регистрировать, а также как этим пользоваться - в будущей заметке.

Также может быть вам интересно:

Панель администрирования Django - настройка вида (шаблона)

Простой способ подключить админку к сайту на Django, как сконфигурировать адмиин-панель, как изменить оформление администрационной панели Django фреймворка.

Читать »

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.

Читать »
Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

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

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

Во время работы программы часто нужно сохранять некоторые важные записи о процессе выполнения команды. В Python есть довольно мощный модуль для работы с логами - давайте разберёмся с тем, как его использовать.

Фото Шаблон разработки ПО — Model View Controller (MVC)

Шаблон разработки ПО — Model View Controller (MVC)

MVC - один из самых распространённых архитектурных шаблонов разработки. Часто используется в различных фреймворках. В том числе и в Django.

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

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

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!