Я не знаю, почему моя форма регистрации django не может создать нового пользователя

Я сделал форму регистрации и представление регистрации в проекте Django. Но кажется, что 'create_user' не работает. Ошибки нет. Представление регистрации просто отправляет браузер на Home без создания нового объекта пользователя Модель пользователя использует email в качестве имени пользователя. Я пытался сделать это с помощью ModelForms, но результат тот же. Я не знаю, почему так происходит.

users/forms.py

class StudentSignUpForm(forms.Form):

    first_name = forms.CharField()
    last_name = forms.CharField()
    email = forms.EmailField(
        widget=forms.EmailInput(attrs={"placeholder": "Enter your emaill adress"})
    )
    password = forms.CharField(
        widget=forms.PasswordInput(attrs={"placeholder": "Enter the Password"})
    )  
    password_confirm = forms.CharField(
        widget=forms.PasswordInput(attrs={"placeholder": "Confirm the Password"})
    )

    def clean_email(self):
        email = self.cleaned_data.get("email")
        try:
            models.User.objects.get(email=email)
            raise forms.ValidationError("This email already exists.")
        except models.User.DoesNotExist:
            return email

    def clean_password_confirm(self):  
        password = self.cleaned_data.get("password")
        password_confirm = self.cleaned_data.get("password_confirm")
        if password != password_confirm:
            raise forms.ValidationError("Password confirmation does not match.")
        else:
            return password

    def save(self):
        first_name = self.cleaned_data.get("first_name")
        last_name = self.cleaned_data.get("last_name")
        email = self.cleaned_data.get("email")
        password = self.cleaned_data.get("password")
        user = models.User.objects.create_user(email, password)
        user.first_name = first_name
        user.last_name = last_name
        user.save()

users/views.py

class StudentSignupView(FormView):

    template_name = "users/student_signup.html"
    form_class = forms.StudentSignUpForm
    success_url = reverse_lazy("core:home")

    def form_vaild(self, form):
        form.save()
        email = form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")
        user = authenticate(self.request, username=email, password=password)
        if user is not None:
            login(self.request, user)
        return super().form_valid(form)

templates/users/student_signup.html

{% extends "base.html" %}

{% block page_title %}
    Student Sign up
{% endblock page_title %}


{% block movie_search_bar %}
{% endblock movie_search_bar %}


{% block people_search_bar %}
{% endblock people_search_bar %}

{% block content %}

    <form method="post" action="{% url 'users:student_signup' %}">
        {% csrf_token %}
            {{form.as_p}}
            <button>Sign up</button>
    </form>
    
{% endblock content%}

users/urls.py

from django.urls import path
from users import views as user_views

app_name = "users"
urlpatterns = [
    path("students/", user_views.StudentList.as_view(), name="list"),
    path(
        "students/<int:pk>", user_views.StudentProfile.as_view(), name="student_profile"
    ),
    path("students/search/", user_views.SearchView.as_view(), name="search"),
    path("users/login/", user_views.LoginView.as_view(), name="login"),
    path("users/logout/", user_views.log_out, name="logout"),
    path("users/signup/", user_views.sign_up, name="signup"),
    path(
        "users/signup/student",
        user_views.StudentSignupView.as_view(),
        name="student_signup",
    ),
]

users/models.py

from django.contrib.auth.models import AbstractUser
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _
from django.db import models


class CustomUserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError("Users require an email field")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self._create_user(email, password, **extra_fields)


class User(AbstractUser):

    """User Model Definition"""

    SCHOOL_ACCA_ROMA = "acccademia_belle_arti_di_roma"
    SCHOOL_CHOICES = ((SCHOOL_ACCA_ROMA, "Accademia Belle Arti di Roma"),)

    ACCOUNT_TYPE_STUDENT = "student"
    ACCOUNT_TYPE_PUBLIC = "public"
    ACCOUNT_TYPE_CHOICES = (
        (ACCOUNT_TYPE_STUDENT, "Studente"),
        (ACCOUNT_TYPE_PUBLIC, "Publico"),
    )

    username = None  # email을 username으로 사용하기 위해 Abspython manage.py migratetractUser의 username을 none으로 override.

    email = models.EmailField(
        _("email address"), unique=True
    )  # _ 는 ugettext_lazy()의 별칭. 언어설정에 따라 출력되는 문자열을 변환해주는 함수다.
    USERNAME_FIELD = "email"  # email을 username처럼 사용하기.
    REQUIRED_FIELDS = (
        []
    )  # AbsractUser에는 email이 Required로 잡혀있으나 USERNAME_FIELD로 사용되는 필드는 REQUIRED에 있으면 안된다.
    school = models.CharField(
        _("accademia"), choices=SCHOOL_CHOICES, max_length=50, null=True, blank=True
    )
    avatar = models.ImageField(upload_to="user_avatars", null=True, blank=True)
    biography = models.TextField(_("biography"), null=True, blank=True)
    account_type = models.CharField(
        _("tipo d'account"),
        choices=ACCOUNT_TYPE_CHOICES,
        max_length=50,
        null=True,
        blank=True,
    )

    objects = CustomUserManager()

    def __str__(self):
        return self.email
Вернуться на верх