虽然已经有可行的解决方案,但它会将所有新字段放在页面底部。如果能够将字段追加到特定部分,并将字段从一个部分移动到另一个部分,那就更好了。
我使用这两个实用程序函数来将字段追加到字段集中并将字段从一个字段集移动到另一个字段集:
common/utils/admin.py
def append_fields(fieldsets, section, fields):
"""
fieldsets : tuple
The fieldsets to append to.
- fieldsets for editing existing objects
- add_fieldsets for adding new objects
section : str or None
The title of the section. None for the titleless section.
fields : tuple
The fields being appended.
"""
for fieldset in fieldsets:
if fieldset[0] == section:
fieldset[1]['fields'] += fields
break
else:
fieldsets = fieldsets + (
(section, {
'classes': ('wide',),
'fields': fields
}),
)
return fieldsets
def move_field(fieldsets, field, from_section, to_section):
"""
fieldsets : tuple
The fieldsets to append to.
- fieldsets for editing existing objects
- add_fieldsets for adding new objects
field: str
The name of the field to move.
from_section : str or None
The title of the section from which to remove the field.
to_section : str or None
The title of the section in which to add the field.
"""
for fieldset in fieldsets:
if fieldset[0] == from_section:
field_list = list(fieldset[1]['fields'])
field_list.remove(field)
fieldset[1]['fields'] = tuple(field_list)
break
else:
raise Exception(f'No such from fieldset: {from_section}')
for fieldset in fieldsets:
print(fieldset)
if fieldset[0] == to_section:
fieldset[1]['fields'] = fieldset[1]['fields'] + (field, )
break
else:
raise Exception(f'No such to fieldset: {to_section}')
然后我将其导入到我的
CustomUserAdmin
类中:
users/admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from common.utils.admin import append_fields, move_field
CustomUser = get_user_model()
class CustomUserAdmin(UserAdmin):
model = CustomUser
new_fields = ('dob', 'avatar')
fieldsets = append_fields(UserAdmin.fieldsets, 'Personal info', new_fields)
move_field(UserAdmin.fieldsets, 'email', 'Personal info', None)
new_fields = ('email', )
optional_fields = ('first_name', 'last_name', 'dob')
add_fieldsets = append_fields(UserAdmin.add_fieldsets, None, new_fields)
add_fieldsets = append_fields(
UserAdmin.add_fieldsets, 'Optional Fields', optional_fields
)
admin.site.register(CustomUser, CustomUserAdmin)
fieldsets
是不可变的,我建议你最好完全覆盖默认的fieldsets
,像这样:UserAdmin.fieldsets = ( (None, {'fields': ('username', 'password')}), (_('个人信息'), {'fields': ('first_name', 'last_name', 'email', 'name', 'contact')}), (_('权限'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), (_('重要日期'), {'fields': ('last_login',)}),
- neverwalkaloner(_('Important dates')
中的下划线是什么意思? - Donovan Keating_('Personal info')
多语言化。您需要像这样导入它:from django.utils.translation import ugettext_lazy as _
。_
只是常用的同义词。有关更多详细信息,请查看文档的相关部分:https://docs.djangoproject.com/en/2.0/topics/i18n/translation/。 - neverwalkaloner