Методы формы регистрации в пользовательской модели пользователя 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

Вернуться на верх