添加用户时出现问题';s在Django admin中的电子邮件
我创建了一个扩展AbstractUser的自定义模型,以便通过电子邮件instad of by username对用户进行身份验证(但不想删除用户名,因为它也会被使用) 这是我在运行第一次迁移之前做的第一件事,除了在Django管理中,其他一切都正常工作。当我创建一个新用户时,我希望这些字段被填充 用户名 电子邮件 密码 管理员只要求我输入用户名和密码。我怎样才能添加电子邮件呢?这是我的密码 models.py添加用户时出现问题';s在Django admin中的电子邮件,django,django-models,django-forms,django-admin,django-users,Django,Django Models,Django Forms,Django Admin,Django Users,我创建了一个扩展AbstractUser的自定义模型,以便通过电子邮件instad of by username对用户进行身份验证(但不想删除用户名,因为它也会被使用) 这是我在运行第一次迁移之前做的第一件事,除了在Django管理中,其他一切都正常工作。当我创建一个新用户时,我希望这些字段被填充 用户名 电子邮件 密码 管理员只要求我输入用户名和密码。我怎样才能添加电子邮件呢?这是我的密码 models.py from django.db import models from django.c
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, email, password, **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, password, **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
管理员
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', 'is_staff', 'is_active',)
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Permissions', {'fields': ('is_staff', 'is_active')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'password1', 'password2', 'is_staff', 'is_active')}
),
)
search_fields = ('email',)
ordering = ('email',)
admin.site.register(CustomUser, UserAdmin)
我该怎么办?看起来一切都是正确的,但缺少必需的电子邮件字段。请注意,这仅在我使用admin中的Add User功能时发生。当我创建超级用户或登录到管理员时,一切都按预期进行
更新:
这是我表单的内容
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', 'is_staff', 'is_active',)
list_filter = ('eamil', 'username', 'is_staff', 'is_active',)
form = UserChangeForm
add_form = UserCreationForm
fieldsets = (
(None, {'fields': ('email', 'username', 'password')}),
('Permissions', {'fields': ('is_staff', 'is_active')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'username', 'password1', 'password2', 'is_staff', 'is_active')}
),
)
search_fields = ('email',)
ordering = ('email',)
admin.site.register(CustomUser, UserAdmin)
但是我仍然有同样的问题,我仍然无法在/admin/users/user/add/中添加电子邮件字段
UserAdmin
类具有form
和add\u 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
我应该在哪里定义这些自定义表单?在forms.py或admin.py?@ionecum中
forms.py
(您也可以在自己的视图中使用这些表单)。它仍然不起作用。我仍然无法在中输入电子邮件迁移文件是否可能导致冲突?我开始用一个空类扩展原始用户的模型,这个空类上有一个简单的“pass”。然后,在第一次迁移之后,我添加了email字段。第一次迁移后更改扩展用户类是否会产生冲突?例如,如果我将first_name和last_name移动到另一个模型,并在扩展用户模型中将它们设置为None,是否会产生迁移冲突?我有这种怀疑和怀疑。以下是我所做的:在第一次迁移之前1。我用空的class 2扩展了用户的模型。在第一次迁移之后,我将AUTH_USER_MODEL='users.USER'放入设置中:1。我将电子邮件设置为身份验证的用户名email=models.EmailField(u('email address'),unique=True)username\u FIELD='email',并编辑了类的其余部分。