我使用AbstractUser方法扩展了django的User模型.问题是,我的自定义字段不会显示在django管理面板中.
我的models.py:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
is_bot_flag = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
我的admin.py:
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
谢谢
小智 21
如果您只想将新字段添加到标准编辑表单(而不是创建),则有一个比上面介绍的更简单的解决方案。
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
class CustomUserAdmin(UserAdmin):
fieldsets = (
*UserAdmin.fieldsets, # original form fieldsets, expanded
( # new fieldset added on to the bottom
'Custom Field Heading', # group heading of your choice; set to None for a blank space instead of a header
{
'fields': (
'is_bot_flag',
),
},
),
)
admin.site.register(User, CustomUserAdmin)
Run Code Online (Sandbox Code Playgroud)
这将获取基本字段集,展开它们,并将新的字段集添加到表单底部。您也可以使用新CustomUserAdmin类来修改模型管理,像其他属性list_display,list_filter或filter_horizontal。相同的 expand-append 方法适用。
UserAdmin如果要查看自定义字段,还必须重写。文档中有一个示例。
您必须创建用于创建(并更改)用户数据和覆盖的表单UserAdmin。用于创建用户的表格为:
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = User
fields = '__all__'
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.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
Run Code Online (Sandbox Code Playgroud)
您可以UserAdmin使用:
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
class UserAdmin(BaseUserAdmin):
add_form = UserCreationForm
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'first_name', 'last_name', 'is_bot_flag', 'password1', 'password2')}
),
)
Run Code Online (Sandbox Code Playgroud)
然后您注册:
admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
我几乎从文档中复制/粘贴了此内容,并删除了一些代码以使其更短。转到文档以查看完整的示例,包括用于更改用户数据的示例代码。
小智 6
在 Django 管理面板中为 AbstractUser 模型显示额外字段的最快方法是将 UserAdmin.fieldsets 元组解压缩到 admin.py 中的列表,然后编辑以在相关部分插入您的字段并重新打包为元组(见下文)。
将此代码添加admin.py到您的 Django 应用程序中
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
fields = list(UserAdmin.fieldsets)
fields[0] = (None, {'fields': ('username', 'password', 'is_bot_flag')})
UserAdmin.fieldsets = tuple(fields)
admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
注意:
list(UserAdmin.fieldsets) 给出了以下列表:
[ (None, {'fields': ('username', 'password')}),
('Personal info', {'fields': ('first_name', 'last_name', 'email')}),
('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups',
'user_permissions')}),
('Important dates', {'fields': ('last_login', 'date_joined')})
]
Run Code Online (Sandbox Code Playgroud)
这些字段默认在 Django 用户模型中,这里我们修改列表的第一个索引以添加我们的自定义字段。
小智 5
模型.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=12)
Run Code Online (Sandbox Code Playgroud)
settings.py:在settings.py中添加以下代码行
AUTH_USER_MODEL = 'users.CustomUser'
Run Code Online (Sandbox Code Playgroud)
表格.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = '__all__'
Run Code Online (Sandbox Code Playgroud)
管理员.py
from django.contrib import admin
from .models import CustomUser
from .forms import CustomUserCreationForm
from django.contrib.auth.admin import UserAdmin
# Register your models here.
class CustomUserAdmin(UserAdmin):
model = CustomUser
add_form = CustomUserCreationForm
fieldsets = (
*UserAdmin.fieldsets,
(
'Other Personal info',
{
'fields': (
'phone_number',
)
}
)
)
admin.site.register(CustomUser, CustomUserAdmin)
Run Code Online (Sandbox Code Playgroud)
全部完成后,然后在终端中运行以下命令
python 管理.py makemigrations
python 管理.py 迁移
python 管理.py runserver
| 归档时间: |
|
| 查看次数: |
6090 次 |
| 最近记录: |