Django UserCreationForm: Создание нового пользователя
Django поставляется со встроенной системой аутентификации пользователей. Эта конфигурация отвечает наиболее распространенным требованиям проекта, обрабатывая широкий спектр задач и используя пароли и разрешения в Python.
Мы можем создать логин пользователя, импортировав модули аутентификации. В этой статье речь пойдет о форме Django UserCreationForm, которая используется для создания нового пользователя. Это встроенный модуль, наследуемый от класса ModelForm. Прежде чем изучать Django UserCreationForm, давайте кратко познакомимся с User.
Что такое пользовательские объекты?
Пользовательские объекты являются основным компонентом системы аутентификации пользователей. Они представлены как посетитель сайта и используются для таких вещей, как предотвращение доступа, регистрация профилей пользователей, сопоставление контента с создателями и многое другое. Но пользовательские объекты класса «суперпользователь» и «администратор» имеют специальные атрибуты.
Пользовательские объекты состоят из следующих основных атрибутов.
Реализация Django UserCreationForm
UserCreationForm используется для создания нового пользователя, который может использовать веб-приложение Django . Он имеет три поля: имя пользователя, пароль1 и пароль2 (который в основном используется для подтверждения пароля).
Чтобы использовать UserCreationForm, нам нужно импортировать его из django.contrib.auth.forms.
from django.contrib.auth.forms import UserCreationForm
Здесь мы создадим представление для обработки запроса.
from django.shortcuts import render from django.contrib.auth.forms import UserCreationForm # Create your views here. def register(request): if request.POST == 'POST': form = UserCreationForm() if form.is_valid(): form.save() messages.success(request, 'Account created successfully') else: form = UserCreationForm() context = < 'form':form >return render(request, 'register.html', context)
Теперь мы создадим путь в Helllo.url.py для обработки запроса.
from django.urls import path from django.contrib import admin from sampleapp.views import register urlpatterns = [ path('admin/', admin.site.urls), path('register', register, name = 'register') ]
Далее мы создадим файл register.html, расширив файл base.html в папке шаблона.
Когда мы отправляем запрос с помощью http://127.0.0.1:8000/register/, мы получаем следующую форму.
Когда мы нажимаем кнопку «Регистрация», будет сгенерирован запрос POST и создан новый пользователь. Вновь созданный пользователь с помощью UserCreationForm() установит is_superuser и is_staff как False, а is_active — как True.
UserCreationForm() предоставляет ограниченное количество полей. Предположим, мы хотим отправить письмо с подтверждением пользователя; мы не можем этого сделать, потому что у него нет поля электронной почты.
Правильная форма регистрации пользователя должна содержать следующие шаги:
- Пользователь заполняет свои данные и нажимает кнопку отправки.
- Сайты отправляют ссылку для подтверждения по почте.
- Пользователь получает ссылку для подтверждения на отправленное им письмо.
Для этого либо мы модифицируем форму UserCreationForm, включая поле электронной почты и средство проверки, либо создаем новую форму регистрации пользователя с нуля.
Мы создадим новую форму регистрации пользователя, потому что она обеспечит полный контроль над формой.
Сначала мы создадим файл forms.py и новый класс CustomUserCreationForm в файле forms.py приложения sampleapp.
from django import forms from django.contrib.auth.models import User from django.contrib.auth.forms import UserCreationForm from django.core.exceptions import ValidationError from django.forms.fields import EmailField from django.forms.forms import Form class CustomUserCreationForm(UserCreationForm): username = forms.CharField(label='username', min_length=5, max_length=150) email = forms.EmailField(label='email') password1 = forms.CharField(label='password', widget=forms.PasswordInput) password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput) def username_clean(self): username = self.cleaned_data['username'].lower() new = User.objects.filter(username = username) if new.count(): raise ValidationError("User Already Exist") return username def email_clean(self): email = self.cleaned_data['email'].lower() new = User.objects.filter(email=email) if new.count(): raise ValidationError(" Email Already Exist") return email def clean_password2(self): password1 = self.cleaned_data['password1'] password2 = self.cleaned_data['password2'] if password1 and password2 and password1 != password2: raise ValidationError("Password don't match") return password2 def save(self, commit = True): user = User.objects.create_user( self.cleaned_data['username'], self.cleaned_data['email'], self.cleaned_data['password1'] ) return user
В приведенном выше коде мы определяем четыре поля: имя пользователя, адрес электронной почты, пароль1 и пароль2 в CustomUserCreationForm. Далее мы определяем индивидуальный метод для каждого поля для очистки данных. Если вы внимательно посмотрите, поле виджета используется как в полях password1, так и в password2. Аргумент ключа виджета позволяет изменить виджет полей по умолчанию.
- username_clean() предотвратит ввод повторяющегося имени пользователя.
- email_clean() предотвратит ввод повторяющихся адресов электронной почты.
- Метод clean_password2() проверит, совпадают ли оба пароля.
И затем метод save() сохранит данные.
Теперь мы обновляем представление register() в файле views.py.
from django.contrib.auth import forms from django.shortcuts import redirect, render from django.contrib import messages from django.contrib.auth.forms import UserCreationForm from .forms import CustomUserCreationForm # Create your views here. def register(request): if request.POST == 'POST': form = CustomUserCreationForm() if form.is_valid(): form.save() else: form = CustomUserCreationForm() context = < 'form':form >return render(request, 'register.html', context)
Здесь мы вводим данные пользователя, чтобы создать нового пользователя, и получаем следующий вывод.
Когда вы пытаетесь создать пользователя с таким же именем, выдается сообщение: Пользователь с таким именем уже существует.
Мы также можем расширить эту форму CustomeUserCreationForm, добавив больше полей и функций, а также мы можем использовать класс form.ModelForm. Но в этом уроке мы использовали класс form.Form.