我目前正在阅读一本关于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)
的话)
非常感谢您的帮助!
答案 0 :(得分:2)
简而言之:在构造 new add_form
时使用CustomUser
,而简单的form
用于现有 CustomerUser
对象的更改数据。
UserAdmin
类将覆盖get_form(..)
方法,如我们在source code [GitHub]中所见:
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
,并且因此指定这样的属性不会有什么不同。