Python add_表单和form之间的区别
我目前正在阅读一本关于Django的书,作者正在使用以下代码创建自定义用户模型: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)
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__)
)