Python add_表单和form之间的区别

Python add_表单和form之间的区别,python,django,django-forms,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)

我目前正在阅读一本关于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)
有人能给我解释一下
添加表单
表单
之间的区别吗

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


非常感谢你的帮助

简言之:构建新的
CustomUser
时使用
添加表单
,而简单的
表单
用于更改现有
CustomerUser
对象的数据

UserAdmin
类重写了
get\u form(..)
方法,我们可以在下面的示例中看到:

该字典将使用作为命名参数传递的参数进行更新。因此,使用
form=self.add\u form
。因此,这会导致使用不同的表单:
add\u表单

例如,如果我们只希望在更新
CustomUser
时能够更新特定字段,那么这将非常有用


请注意,只有
UserAdmin
具有这样的
get\u表单
覆盖,据我所知,
ModelAdmin
本身没有
add\u表单
,因此指定这样的属性不会有什么区别。

顾名思义,
add\u表单
用于创建新用户,
表单
用于更改现有用户的数据。非常感谢您的详细回答,您能否在
管理网站上澄清一下。注册(CustomUser,CustomUserAdmin)
部分我们为什么同时注册
CustomUser
CustomUserAdmin
。非常感谢。据我所知,如果我们指定
form
属性,我们还应该指定
add\u form
@Fozo:我们不同时注册这两个属性,而是注册一个链接。我们注册了
CustomUser
模型管理员
CustomUserAdmin
:@Fozoro:不,这是针对
UserAdmin
的,请注意,仅对于该类,它“覆盖”表单选择。是的,对不起,这就是我的意思,如果我们在UserAdmin中指定表单,我们还应该指定一个add\u表单
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)
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__)
        )