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})