Я не знаю, почему моя форма регистрации 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