我目前正在阅读有关Django的书,并且达到了作者使用以下代码创建自定义用户模型的地步:
from django.contrib import admin
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
admin.site.register(CustomUser, CustomUserAdmin)
有人可以向我解释
add_form
和form
有什么区别?(如果有人还能告诉我为什么我们在
CustomUser
中同时包含CustomUserAdmin
和admin.site.register(CustomUser, CustomUserAdmin)
那就太好了)非常感谢您的帮助!
最佳答案
简而言之:在构造新的add_form
时使用CustomUser
,而简单的form
用于更改现有CustomerUser
对象的数据。
如我们在source code [GitHub]中所见,UserAdmin
类覆盖了get_form(..)
方法:
def get_form(self, request, obj=None, **kwargs):
"""
Use special form during user creation
"""
defaults = {}
if obj is None:
defaults['form'] = self.add_form
defaults.update(kwargs)
return super().get_form(request, obj, **defaults)
现在,
get_form
类(ModelAdmin
的超类)的UserAdmin
本身使用属性字典来调用modelform_factory(..)
,正如我们在source code [GitHub]中所看到的:def get_form(self, request, obj=None, change=False, **kwargs):
# ...
defaults = {
'form': form,
'fields': fields,
'exclude': exclude,
'formfield_callback': partial(self.formfield_for_dbfield, request=request),
**kwargs,
}
if defaults['fields'] is None and not modelform_defines_fields(defaults['form']):
defaults['fields'] = forms.ALL_FIELDS
try:
return modelform_factory(self.model, **defaults)
except FieldError as e:
raise FieldError(
'%s. Check fields/fieldsets/exclude attributes of class %s.'
% (e, self.__class__.__name__)
)
该字典将使用作为命名参数传递的参数进行更新。所以用
form=self.add_form
。因此,这导致使用另一种形式:add_form
。例如,如果我们仅希望能够在更新
CustomUser
时更新特定字段,则此功能将非常有用。请注意,据我所知,只有
UserAdmin
具有这样的get_form
覆盖,ModelAdmin
本身没有add_form
,因此指定这样的属性不会有任何不同。