add_form和form之间的区别

6

我正在阅读一本关于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_formform的区别吗?

如果有人能告诉我为什么在admin.site.register(CustomUser, CustomUserAdmin)中要同时包括CustomUserCustomUserAdmin,那就太好了。

非常感谢您的帮助!


正如名称所示,add_form 用于创建用户,而 form 则用于更改现有用户的数据。 - Willem Van Onsem
1个回答

7
简而言之:当您构建一个新的CustomUser时,使用add_form,而简单的form用于更改现有CustomerUser对象的数据。
UserAdmin类覆盖了get_form(..)方法,正如我们在源代码[GitHub]中所看到的。
def get_form(self, request, obj=None, **kwargs):
    """
    Use special form during user creation
    """
    defaults = {}
    <b>if obj is None:
        defaults['form'] = self.add_form</b>
    defaults.update(kwargs)
    return super().get_form(request, obj, **defaults)

现在,ModelAdmin类(UserAdmin的父类)的get_form方法会使用属性字典调用modelform_factory(..),我们可以在源代码[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,因此指定这样的属性不会有任何影响。

非常感谢您详细的回答,能否再解释一下admin.site.register(CustomUser, CustomUserAdmin)这部分为什么要同时注册CustomUserCustomUserAdmin。非常感谢。 - Nazim Kerimbekov
据我所了解,如果我们正在指定 form 属性,那么我们还应该指定 add_form - Nazim Kerimbekov
@Fozo:我们不注册两者,我们注册一个链接。我们为CustomUser注册了模型管理器CustomUserAdmin:https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#the-register-decorator - Willem Van Onsem
@Fozoro:不,这只适用于UserAdmin,请注意,仅针对该类,它“覆盖”了表单选择。 - Willem Van Onsem
是的,对不起,我的意思是如果我们在UserAdmin中指定了一个表单,我们也应该指定一个add_form。 - Nazim Kerimbekov
让我们在聊天中继续这个讨论 - Nazim Kerimbekov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接