add_form和form之间的区别

时间:2019-01-18 22:10:25

标签: python django django-forms

我目前正在阅读一本关于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有什么区别吗?

(如果有人还能告诉我为什么我们在CustomUser中同时包含CustomUserAdminadmin.site.register(CustomUser, CustomUserAdmin)的话)

非常感谢您的帮助!

1 个答案:

答案 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,并且因此指定这样的属性不会有什么不同。

相关问题