Django: Доступ к пользовательской модели пользователя (созданной в соответствии с Django Docs) для создания нового пользователя с помощью нового шаблона (signup.html)

Здесь я размещаю то, что я сделал, следуя сообщениям других... Я могу создать пользователя из стандартного админ сайта, войдя в систему, а также войдя в систему, используя пользовательскую модель пользователя "MyUser". Я хочу использовать модель пользователя "по умолчанию" для создания пользователей Admin и хочу использовать модель пользователя "MyUser" для создания всех остальных пользователей. Я пытаюсь это сделать уже 3 дня, но ничего не получается. Заранее спасибо за помощь.

Я новичок в Django. Как я выяснил, проблемы возникают в forms.py и views.py

signup.html

admin.py

from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.contrib.auth.models import Group
from django.core.exceptions import ValidationError

from .models import MyUser


class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = MyUser
        fields = ('username', 'email', 'country', 'gender')

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = MyUser
        fields = ('username', 'password', 'email', 'gender', 'country', 'is_active', 'is_admin')


class UserAdmin(BaseUserAdmin):
    form = UserChangeForm
    add_form = UserCreationForm

    list_display = ('username', 'email', 'gender', 'country', 'is_active', 'is_admin')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('username', 'gender', 'country',)}),
        ('Permissions', {'fields': ('is_admin',)}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'email', 'gender', 'country', 'password1', 'password2'),
        }),
    )
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()


admin.site.register(MyUser, UserAdmin)
# admin.site.unregister(Group)

models.py

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)


class MyUserManager(BaseUserManager):
    def create_user(self, username, email, country, gender, password=None):
        if not email:
            raise ValueError('Users must have an email address')
        if not username:
            raise ValueError('Provide your Full Name')
        if not country:
            raise ValueError('Select your Country')
        if not gender:
            raise ValueError('Select your Gender')

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            country=country,
            gender=gender,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, country, gender, password=None):
        user = self.create_user(
            username, email, country, gender,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

    class Meta:
        app_label = 'users'


class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    username = models.CharField(max_length=255)
    country = models.CharField(max_length=255)
    gender = models.CharField(max_length=63)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'gender', 'country']

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.is_admin

    class Meta:
        app_label = 'users'

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


# Create your forms here.

class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True, max_length=255)
    gender = forms.CharField(required=True, max_length=63)
    country = forms.CharField(required=True, max_length=255)

    class Meta:
        model = User
        fields = ("username", "password1", "password2", "email", "gender", "country")
        app_label = 'users'

    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.username = self.cleaned_data['username']
        user.email = self.cleaned_data['email']
        user.gender = self.cleaned_data['gender']
        user.country = self.cleaned_data['country']
        if commit:
            user.save()
        return user

views.py

def signup_view(request):
    form = NewUserForm(request.POST)
    if form.is_valid():
        form.save()
        username = form.cleaned_data.get('username')
        password = form.cleaned_data.get('password1')
        user = authenticate(username=username, password=password)
        login(request, user)
        return redirect('/home')
    return render(request, 'signup.html', {'form': form})
Вернуться на верх