Методы формы регистрации в пользовательской модели пользователя django
Я создаю пользовательскую модель пользователя для django.Мой вопрос: Когда я создаю пользователя через шаблонную форму, методы (clean_user_name, clean_password2, clean_email) в классе RegistrationForm в forms.py вызываются автоматически, когда пользователь пытается заполнить форму, почему это происходит, насколько я знаю, автоматически вызывается только метод init.
models.py
class CustomAccountManager(BaseUserManager):
def create_superuser(self, email, user_name, password, **other_fields):
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_active', True)
if other_fields.get('is_staff') is not True:
raise ValueError(
'Superuser must be assigned to is_staff=True.')
if other_fields.get('is_superuser') is not True:
raise ValueError(
'Superuser must be assigned to is_superuser=True.')
return self.create_user(email, user_name, password, **other_fields)
def create_user(self, email, user_name, password, **other_fields):
if not email:
raise ValueError(_('You must provide an email address'))
email = self.normalize_email(email)
user = self.model(email=email, user_name=user_name,
**other_fields)
user.set_password(password)
user.save()
return user
class UserBase(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
user_name = models.CharField(max_length=150, unique=True)
first_name = models.CharField(max_length=150, blank=True)
about = models.TextField(_(
'about'), max_length=500, blank=True)
# Delivery details
country = CountryField()
phone_number = models.CharField(max_length=15, blank=True)
postcode = models.CharField(max_length=12, blank=True)
address_line_1 = models.CharField(max_length=150, blank=True)
address_line_2 = models.CharField(max_length=150, blank=True)
town_city = models.CharField(max_length=150, blank=True)
# User Status
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
objects = CustomAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['user_name']
class Meta:
verbose_name = "Accounts"
verbose_name_plural = "Accounts"
def email_user(self, subject, message):
send_mail(
subject,
message,
'l@1.com',
[self.email],
fail_silently=False,
)
def __str__(self):
return self.user_name
forms.py
from django.shortcuts import render
from django import forms
from django.contrib.auth.forms import (AuthenticationForm, PasswordResetForm,
SetPasswordForm)
from .models import UserBase
# Create your views here.
class RegistrationForm(forms.ModelForm):
user_name = forms.CharField(
label='Enter Username', min_length=4, max_length=50, help_text='Required')
email = forms.EmailField(max_length=100, help_text='Required', error_messages={
'required': 'Sorry, you will need an email'})
password = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(
label='Repeat password', widget=forms.PasswordInput)
class Meta:
model = UserBase
fields = ('user_name', 'email',)
def clean_user_name(self):
user_name = self.cleaned_data['user_name'].lower()
r = UserBase.objects.filter(user_name=user_name)
if r.count():
raise forms.ValidationError("Username already exists")
return user_name
def clean_password2(self):
cd = self.cleaned_data
if cd['password'] != cd['password2']:
raise forms.ValidationError('Passwords not match.')
return cd['password2']
def clean_email(self):
email = self.cleaned_data['email']
if UserBase.objects.filter(email=email).exists():
raise forms.ValidationError(
'Please use another Email, that is already taken')
return email
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['user_name'].widget.attrs.update(
{'class': 'form-control mb-3', 'placeholder': 'Username'})
self.fields['email'].widget.attrs.update(
{'class': 'form-control mb-3', 'placeholder': 'E-mail', 'name': 'email', 'id': 'id_email'})
self.fields['password'].widget.attrs.update(
{'class': 'form-control mb-3', 'placeholder': 'Password'})
self.fields['password2'].widget.attrs.update(
{'class': 'form-control', 'placeholder': 'Repeat Password'})
views.py
def register(request):
if request.method == 'POST':
form=RegistrationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
print(user)
user.email = form.cleaned_data['email']
print(user.email)
user.set_password(form.cleaned_data['password'])
user.is_active = False
user.save()
current_site = get_current_site(request)
subject = 'Activate your Account'
message = render_to_string('account/registration/account_activation_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
user.email_user(subject=subject, message=message)
return HttpResponse('registered succesfully and activation sent')
else:
form=RegistrationForm()
return render (request,'account/registration/registration.html',{'form':form})
registration.html