Django: добавление пользователя на страницу администратора с помощью пользовательской модели пользователя
Я определил пользовательскую модель пользователя в моем проекте Django, которая определяет 'email' как уникальный идентификатор. Я создал пользовательскую форму создания пользователя, следуя документации Django, и зарегистрировал ее в моем admin.py. Когда я запускаю веб-сервер, в консоли не появляется никаких ошибок.
Моя проблема в том, что add_form на странице администратора не отображается поле 'email', а только 'username', 'password1' и 'password2'
Я прочитал несколько руководств и учебников и проверил документацию Django, чтобы решить эту проблему, и боюсь, что я что-то упускаю.
settings.py
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig'
]
AUTH_USER_MODEL = 'users.NewUser'
model.py
forms.py
from django import forms
from django.contrib import admin
from django.core.exceptions import ValidationError
# Import custom user model
from django.contrib.auth import get_user_model
custom_user_model = get_user_model()
class CustomUserCreationForm(forms.ModelForm):
"""A form for creating new users. Includes all the required
fields, plus a repeated password."""
username = forms.CharField(label='Username', min_length=4, max_length=150)
email = forms.EmailField(label='E-Mail')
first_name = forms.CharField(label='First Name')
last_name = forms.CharField(label='Last Name')
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = custom_user_model
fields = ('username', 'first_name', 'last_name')
def clean_password2(self):
# Check that the two password entries match
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):
# Save the provided password in hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin # Helper Class for creating user admin pages
from .forms import CustomUserCreationForm #, CustomUserChangeForm
from .models import NewUser, UserProfile
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
model = NewUser
list_display = ('email', 'username', 'date_joined', 'last_login', 'is_admin', 'is_staff')
search_fields = ('email', 'username',)
readonly_fields = ('date_joined', 'last_login',)
filter_horizontal = ()
list_filter = ()
fieldsets = ()
admin.site.register(custom_user_model, CustomUserAdmin)
Добавьте этот код в CustomeUserAdmin:
class CustomUserAdmin(UserAdmin):
.
.
.
add_fieldsets = UserAdmin.add_fieldsets + (
(None, {'fields': ('custom_field',)}),
)
Похоже, что форма на странице администратора django создается на основе add_fieldsets. Я также не знаю, что на самом деле делает add_form.
Для получения дополнительной информации читайте документацию django: django docs about admin, Полный пример для пользователей Custome в django admin
Если вы используете пользовательский ModelAdmin, который является подклассом django.contrib.auth.admin.UserAdmin, то вам нужно добавить ваши пользовательские поля в fieldsets (для полей, которые будут использоваться при редактировании пользователей) и в add_fieldsets (для полей, которые будут использоваться при создании пользователя).
.