В этом разделе мы рассмотрим создание формы регистрации, формы авторизации и функции выхода на Django, а также создадим необходимые представления для них.
Создаем форму регистрации
В нашем приложении accounts, которое мы создавали в разделе с профилями, откроем файл forms.py и в самый низ будем добавлять новые формы: регистрации и авторизации.
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class UserRegisterForm(UserCreationForm):
"""
Переопределенная форма регистрации пользователей
"""
class Meta(UserCreationForm.Meta):
fields = UserCreationForm.Meta.fields + ('email', 'first_name', 'last_name')
def clean_email(self):
"""
Проверка email на уникальность
"""
email = self.cleaned_data.get('email')
username = self.cleaned_data.get('username')
if email and User.objects.filter(email=email).exclude(username=username).exists():
raise forms.ValidationError('Такой email уже используется в системе')
return email
def __init__(self, *args, **kwargs):
"""
Обновление стилей формы регистрации
"""
super().__init__(*args, **kwargs)
self.fields['username'].widget.attrs.update({"placeholder": "Придумайте свой логин"})
self.fields['email'].widget.attrs.update({"placeholder": "Введите свой email"})
self.fields['first_name'].widget.attrs.update({"placeholder": "Ваше имя"})
self.fields['last_name'].widget.attrs.update({"placeholder": "Ваша фамилия"})
self.fields['password1'].widget.attrs.update({"placeholder": "Придумайте свой пароль"})
self.fields['password2'].widget.attrs.update({"placeholder": "Повторите придуманный пароль"})
for field in self.fields:
self.fields[field].widget.attrs.update({"class": "form-control", "autocomplete": "off"})
Так как встроенная система авторизации и регистрации нас устраивает, то можно воспользоваться переопределением форм. К переопределенной форме мы добавили метод проверки clean_email на уникальность email адреса, также добавили поля для ввода при регистрации: email, first_name, last_name. Стили используем Bootstrap.
Также добавим форму входа:
from django.contrib.auth.forms import AuthenticationForm
class UserLoginForm(AuthenticationForm):
"""
Форма авторизации на сайте
"""
def __init__(self, *args, **kwargs):
"""
Обновление стилей формы авторизации
"""
super().__init__(*args, **kwargs)
self.fields['username'].widget.attrs['placeholder'] = 'Логин пользователя'
self.fields['password'].widget.attrs['placeholder'] = 'Пароль пользователя'
self.fields['username'].label = 'Логин'
for field in self.fields:
self.fields[field].widget.attrs.update({
'class': 'form-control',
'autocomplete': 'off'
})
В примере выше мы наследуемся от существующей формы авторизации, только добавив к ней стили от Boostrap, и некоторые placeholder.