Как создать пользовательскую форму регистрации с помощью django-registration в Django 5.0.2 с Django Registration 3.4

Признаюсь, я новичок в Django, но уже целый день бьюсь головой об стену с этой проблемой. Я создал новое приложение и унаследовал классы от django_registration, но, похоже, данные моей формы никогда не сохраняются. Мои поля отображаются и доступны как во фронт-энде, так и в области администрирования, но регистрация пользователя никогда не происходит, и я не получаю ошибок. (Это прекрасно работает со стандартной django-регистрацией, но я хочу расширить ее и запланировать на будущее.)

forms.py

from django_registration.forms import RegistrationForm
from authentication.models import MyCustomUser
from django import forms

class MyCustomUserForm(RegistrationForm): 
    class Meta(RegistrationForm.Meta):
        model = MyCustomUser
        #fields = "__all__"
        fields = ['username', 'email', 'first_name', 'last_name', 'profile_photo', 'password1', 'password2']

models.py

from django.contrib.auth.models import AbstractUser
from django.db import models
from django import forms

class MyCustomUser(AbstractUser):
    ROLE_CHOICES = (
        ('APPLICANT', 'Applicant'),
        ('EMPLOYEE', 'Employee'),
        ('ADMIN', 'Admin'),
        (None, 'None')
    )
    role = models.CharField(max_length=30, choices=ROLE_CHOICES)
    profile_photo = models.ImageField()
    #username = forms.CharField(max_length = 100) #this is already handled for us in AbstractUser
    #email  = forms.EmailField(max_length = 100) #this is already handled for us in AbstractUser
    #password1 = forms.CharField(widget = forms.PasswordInput(), max_length = 100) #this is already handled for us in AbstractUser
    #password2 = forms.CharField(widget = forms.PasswordInput(),  max_length = 100) #this is already handled for us in AbstractUser
    first = forms.CharField(max_length = 100 )
    last = forms.CharField(max_length = 100)
    #USERNAME_FIELD = username #this is already handled for us in AbstractUser
    REQUIRED_FIELDS = []

admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import MyCustomUserForm
from .models import MyCustomUser

class CustomUserAdmin(UserAdmin):
    add_form = MyCustomUserForm
    #form = CustomUserChangeForm
    model = MyCustomUser
    list_display = ["email", "username", "first_name", "last_name", "profile_photo", "role"]

admin.site.register(MyCustomUser, CustomUserAdmin)

settings.py

AUTH_USER_MODEL = 'authentication.MyCustomUser'

urls.py

path('accounts/register/', SignUpView.as_view(), name='django_registration_register')

views.py

from django.shortcuts import render, redirect
from django.views.generic import View
from django.views import generic
from django_registration.views import RegistrationView as BaseRegistrationView
from authentication.forms import MyCustomUserForm

class SignUpView(BaseRegistrationView):#generic.CreateView
    form_class = MyCustomUserForm
    template_name = "authentication/registration_form.html"

Я попробовал добавить методы из https://github.com/ubernostrum/django-registration/blob/trunk/src/django_registration/backends/activation/views.py в свой views.py, но разницы нет. Я подумал, что если я унаследую класс, то методы будут доступны в любом случае. Я просмотрел документацию на https://django-registration.readthedocs.io/en/latest/index.html, пытаясь понять, что мне нужно сделать, но мне не ясно, что я здесь упускаю.

Ваша модель MyCustomUser наследуется от AbstractUser, что правильно, но использование полей форм Django непосредственно в модели (переменные first и last) не корректно. Модели должны определять поля базы данных, а не поля форм. Вам следует удалить их и использовать поля first_name и last_name, предоставляемые AbstractUser, как показано ниже:

from django.contrib.auth.models import AbstractUser
from django.db import models

class MyCustomUser(AbstractUser):
    ROLE_CHOICES = (
        ('APPLICANT', 'Applicant'),
        ('EMPLOYEE', 'Employee'),
        ('ADMIN', 'Admin'),
        (None, 'None')
    )
    role = models.CharField(max_length=30, choices=ROLE_CHOICES, default=None, blank=True, null=True)
    profile_photo = models.ImageField(upload_to='profile_photos/', blank=True, null=True)  # Specify upload directory and make it optional if you want

Это должно решить вашу проблему.

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