如何解决在 Django admin
我创建了一个扩展 AbstractUser 的自定义模型,以便通过电子邮件代替用户名来验证用户(但不想删除用户名,因为它也会被使用)。
这是我在运行第一次迁移之前所做的第一件事,除了在 Django 管理员中,一切正常,当我创建一个新用户时,我希望填充这些字段 用户名 电子邮件 密码
管理员只问我用户名和密码。我怎样才能添加电子邮件?这是我的代码
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _
class CustomUserManager(BaseUserManager):
"""
Custom user model manager where email is the unique identifier for
authentication instead of username.
"""
def create_user(self,email,password,**extra_fields):
"""
Create and save a User with the given email and password.
"""
if not email:
raise ValueError(_('The Email must be set'))
email = self.normalize_email(email)
user = self.model(email=email,**extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self,**extra_fields):
"""
Create and save a SuperUser with the given email and password.
"""
extra_fields.setdefault('is_staff',True)
extra_fields.setdefault('is_superuser',True)
extra_fields.setdefault('is_active',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,**extra_fields)
class User(AbstractUser):
email = models.EmailField(_('email address'),unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User as CustomUser
class CustomUserAdmin(UserAdmin):
model = CustomUser
list_display = ('email','is_staff','is_active',)
list_filter = ('eamil',)
fieldsets = (
(None,{'fields': ('email','password')}),('Permissions',{'fields': ('is_staff','is_active')}),)
add_fieldsets = (
(None,{
'classes': ('wide',),'fields': ('email','password1','password2','is_active')}
),)
search_fields = ('email',)
ordering = ('email',)
admin.site.register(CustomUser,UserAdmin)
我该怎么办?似乎一切都正确,但缺少所需的电子邮件字段。请注意,这仅在我使用管理员中的添加用户功能时发生。当我创建超级用户或登录管理员时,一切都按预期工作。
更新: 这是我的 forms.py 的内容
from django.contrib.auth.forms import UserCreationForm
# the user model was customized it should be invoked
from django.contrib.auth import get_user_model
from django.contrib.auth import forms as auth_forms
from .models import User as CustomUser
class UserChangeForm(auth_forms.UserChangeForm):
class Meta(auth_forms.UserChangeForm.Meta):
model = CustomUser
class UserCreationForm(auth_forms.UserCreationForm):
class Meta(auth_forms.UserCreationForm.Meta):
model = CustomUser
fields = ("username","email")
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
# the user model was customized it should be invoked
model = get_user_model()
fields = UserCreationForm.Meta.fields + ("email",)
这里是我的 admin.py 的内容(更新)
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User as CustomUser
from .forms import UserChangeForm,UserCreationForm
class CustomUserAdmin(UserAdmin):
model = CustomUser
list_display = ('email','username',)
form = UserChangeForm
add_form = UserCreationForm
fieldsets = (
(None,UserAdmin)
但是我还是有同样的问题,我仍然无法在/admin/users/user/add/中添加电子邮件字段
解决方法
UserAdmin
类具有属性 form
和 add_form
,它们分别指向用于编辑和创建用户的表单类。您需要覆盖这些表单类并自己设置这些属性,因为这两个表单是为默认用户模型创建的。
首先定义这些自定义表单:
from django.contrib.auth import forms as auth_forms
from .models import User as CustomUser
class UserChangeForm(auth_forms.UserChangeForm):
class Meta(auth_forms.UserChangeForm.Meta):
model = CustomUser
class UserCreationForm(auth_forms.UserCreationForm):
class Meta(auth_forms.UserCreationForm.Meta):
model = CustomUser
fields = ("username","email")
接下来在您的 CustomUserAdmin
中设置这些:
from .forms import UserChangeForm,UserCreationForm
class CustomUserAdmin(UserAdmin):
# Your other attributes here
form = UserChangeForm
add_form = UserCreationForm
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。