Foz*_*oro 4 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)
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释add_form和之间有什么区别form吗?
(如果有人还告诉我,为什么我们包括CustomUser和CustomUserAdmin在admin.site.register(CustomUser, CustomUserAdmin)那将是巨大的)
非常感谢您的帮助!
简而言之: theadd_form用于构造new CustomUser,而 simpleform用于更改现有 CustomerUser对象的数据。
的UserAdmin类重写get_form(..)方法,因为我们可以在看到源代码[GitHub上]:
Run Code Online (Sandbox Code Playgroud)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(..)使用属性字典调用,正如我们在源代码 [GitHub] 中看到的:
Run Code Online (Sandbox Code Playgroud)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.
例如,如果我们只想在更新a时更新特定字段,这会很有用CustomUser。
请注意,只有UserAdmin有这样的get_form覆盖,据我所知, aModelAdmin本身没有 add_form,因此指定这样的属性不会有什么不同。
| 归档时间: |
|
| 查看次数: |
1280 次 |
| 最近记录: |