Django Custom User --- 在 admin 中编辑新的 CustomUser 字段
Django Custom User --- Edit new CustomUser fields in admin
我正在尝试扩展下面发布的 William Vincent 教程:
https://wsvincent.com/django-custom-user-model-tutorial/
我正在尝试向通过从 django.contrib.auth.models:
导入的 AbstractUser 扩展的 CustomerUser 模型添加新字段
users/models.py:
from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager
class CustomUserManager(UserManager):
pass
class CustomUser(AbstractUser):
bio = models.TextField(max_length=500, blank=True)
objects = CustomUserManager()
def __str__(self):
return self.username
我在上面的模型中添加了 'bio' 字段,但是当我通过 django 管理门户访问用户时,我没有在默认管理中看到新的 'bio' 字段用 django 打包的字段:即:个人信息:名字、姓氏、电子邮件地址等
我的 CustomUser 应用程序已注册到管理门户(按照上述教程):
作为对自己的测试,我能够在 list_display 中成功显示个人简介字段(如预期显示为空白)。重申一下,我的问题是当我点击编辑用户时我无法更新这个字段。好消息是 django 获取了我的新 'bio' 字段的迁移。
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['username', 'email','is_staff', 'bio']
admin.site.register(CustomUser, CustomUserAdmin)
我猜我正在寻找的解决方案与编辑管理表单有关。这是我的用户应用程序中的内容(来自教程)。
users/forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = CustomUser
fields = ('username', 'email')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('username', 'email')
诚然,我对上面 form.py 文件中发生的事情并没有很好的理解。我怀疑它可能与我通过管理门户访问的实际用户编辑表单无关,所以我可能只需要弄清楚如何更改默认的 django 管理应用程序。
一如既往,非常感谢您的帮助,谢谢!
安迪尝试将此添加到您的管理员 class:
fieldsets = (
(('User'), {'fields': ('username', 'email','is_staff', 'bio')}),
)
您还可以添加其他集,例如另一个关于权限的部分,可以显示有关 is_active 或组的信息。你可以这样做:
fieldsets = (
(('User'), {'fields': ('username', 'email','is_staff', 'bio')}),
(('Permissions'), {'fields': ('is_active','is_staff')}),
)
您可以在 list_display 下插入字段集。对于您不想在管理员中编辑的字段,还有一个 readonly_fields。
'fieldsets +' 方法比必须再次写出所有默认字段要好得多。
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('some_extra_data',)}),
)
要将“个人简介”字段添加到“个人信息”部分而不是仅添加到用户管理的末尾,并且要在不指定每个现有字段的情况下这样做,您可以构建一个新的 fieldsets
parent class 中的属性,同时仅将新的“个人简介”字段添加到“个人信息”部分并保留其他所有内容。
如果您只是简单地附加到 parent 的 fieldsets
属性,则该字段将出现在页面底部,而不是“个人信息”部分的末尾。
此代码复制了 parent 的 fieldsets
属性,并保留了所有内容 as-is 除了“个人信息”部分中的 fields
元组具有附加了“生物”。
在 users/admin.py
中:
class CustomUserAdmin(UserAdmin):
# Add a "bio" field to the User admin page.
fieldsets = tuple(
# For the "Personal info" fieldset, drill down to the fields,
# preserving everything else.
(fieldset[0], {
# Preserve any entries in the dict other than "fields".
**{key: value for (key, value) in fieldset[1].items() if key != 'fields'},
# Add the "bio" field to the existing fields
'fields': fieldset[1]['fields'] + ('bio',)
})
# Preserve any fieldsets other than "Personal info".
if fieldset[0] == 'Personal info'
else fieldset
for fieldset in UserAdmin.fieldsets
)
注意: {**some_dict, new_key: new_value}
语法要求 Python 3.5 或更高版本。
我正在尝试扩展下面发布的 William Vincent 教程:
https://wsvincent.com/django-custom-user-model-tutorial/
我正在尝试向通过从 django.contrib.auth.models:
导入的 AbstractUser 扩展的 CustomerUser 模型添加新字段users/models.py:
from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager
class CustomUserManager(UserManager):
pass
class CustomUser(AbstractUser):
bio = models.TextField(max_length=500, blank=True)
objects = CustomUserManager()
def __str__(self):
return self.username
我在上面的模型中添加了 'bio' 字段,但是当我通过 django 管理门户访问用户时,我没有在默认管理中看到新的 'bio' 字段用 django 打包的字段:即:个人信息:名字、姓氏、电子邮件地址等
我的 CustomUser 应用程序已注册到管理门户(按照上述教程):
作为对自己的测试,我能够在 list_display 中成功显示个人简介字段(如预期显示为空白)。重申一下,我的问题是当我点击编辑用户时我无法更新这个字段。好消息是 django 获取了我的新 'bio' 字段的迁移。
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['username', 'email','is_staff', 'bio']
admin.site.register(CustomUser, CustomUserAdmin)
我猜我正在寻找的解决方案与编辑管理表单有关。这是我的用户应用程序中的内容(来自教程)。
users/forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = CustomUser
fields = ('username', 'email')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('username', 'email')
诚然,我对上面 form.py 文件中发生的事情并没有很好的理解。我怀疑它可能与我通过管理门户访问的实际用户编辑表单无关,所以我可能只需要弄清楚如何更改默认的 django 管理应用程序。
一如既往,非常感谢您的帮助,谢谢!
安迪尝试将此添加到您的管理员 class:
fieldsets = (
(('User'), {'fields': ('username', 'email','is_staff', 'bio')}),
)
您还可以添加其他集,例如另一个关于权限的部分,可以显示有关 is_active 或组的信息。你可以这样做:
fieldsets = (
(('User'), {'fields': ('username', 'email','is_staff', 'bio')}),
(('Permissions'), {'fields': ('is_active','is_staff')}),
)
您可以在 list_display 下插入字段集。对于您不想在管理员中编辑的字段,还有一个 readonly_fields。
'fieldsets +' 方法比必须再次写出所有默认字段要好得多。
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('some_extra_data',)}),
)
要将“个人简介”字段添加到“个人信息”部分而不是仅添加到用户管理的末尾,并且要在不指定每个现有字段的情况下这样做,您可以构建一个新的 fieldsets
parent class 中的属性,同时仅将新的“个人简介”字段添加到“个人信息”部分并保留其他所有内容。
如果您只是简单地附加到 parent 的 fieldsets
属性,则该字段将出现在页面底部,而不是“个人信息”部分的末尾。
此代码复制了 parent 的 fieldsets
属性,并保留了所有内容 as-is 除了“个人信息”部分中的 fields
元组具有附加了“生物”。
在 users/admin.py
中:
class CustomUserAdmin(UserAdmin):
# Add a "bio" field to the User admin page.
fieldsets = tuple(
# For the "Personal info" fieldset, drill down to the fields,
# preserving everything else.
(fieldset[0], {
# Preserve any entries in the dict other than "fields".
**{key: value for (key, value) in fieldset[1].items() if key != 'fields'},
# Add the "bio" field to the existing fields
'fields': fieldset[1]['fields'] + ('bio',)
})
# Preserve any fieldsets other than "Personal info".
if fieldset[0] == 'Personal info'
else fieldset
for fieldset in UserAdmin.fieldsets
)
注意: {**some_dict, new_key: new_value}
语法要求 Python 3.5 或更高版本。