我正在编写一个小应用程序,允许django管理员更改列表中的AddThis共享字段允许用户共享他们当前正在编辑的对象(以及查看共享计数):
以一个简单的BlogEntry为例,我创建了一个自定义的ModelAdmin:
class AddThisAdmin(admin.ModelAdmin):
addthis_config = {
'title_field' : None,
'description_field' : None,
'url_field' : None,
'image_field' : None,
}
def get_form(self, request, obj=None, *args, **kwargs):
metaform = super(AddThisAdmin, self).get_form(request, obj, **kwargs)
if obj:
# Grab users config and find the fields they specified ...
metaform.base_fields['add_this'] = AddThisField(self.add_this)
return metaform
在用户BlogEntryAdmin中继承了哪个:
class BlogEntryAdmin(admin.ModelAdmin, AddThisAdmin):
addthis_config = {
'title_field' : 'blog_title',
'description_field' : 'blurb',
}
其中addthis_config
允许用户指定BlogEntry对象中的字段,从哪里拉出AddThis中使用的title / description / url和图像。这一切都很好用,直到我决定在BlogEntryAdmin中使用自定义字段集:
class BlogEntryAdmin(admin.ModelAdmin, AddThisAdmin):
addthis_config = {
'title_field' : 'blog_title',
'description_field' : 'blurb',
}
fieldsets = [{ ... }]
'BlogEntry.fieldsets 0 ['fields']'指的是表单中缺少的字段'add_this'。
我理解这种情况正在发生,因为django管理员在实际实例化之前对BlogEntryAdmin类的fieldsets(django.contrib.admin.validation)运行验证(并插入我的自定义字段)。
tldr :有没有办法告诉django.contrib.admin.validation
忽略字段集中的字段?
答案 0 :(得分:2)
典型的方法是提供像AddThisAdminForm
这样的基本形式,它具有必需的字段,而其他的ModelAdmin形式则继承该格式。看起来你正试图避免这种情况,并自动将字段插入到正在使用的任何形式中。如果你坚持这种方法,那么下面的内容应该会更好:
def get_form(self, request, obj=None, **kwargs):
ModelForm = super(AddThisAdmin, self).get_form(request, obj, **kwargs)
class AddThisForm(ModelForm):
add_this = AddThisField(self.add_this)
return AddThisForm
答案 1 :(得分:1)
没有记录,但您可以使用get_fieldsets
方法来定义字段集。举个例子,看看Django在添加新用户时如何更改UserAdmin
中的字段集。
我没有测试过这个,但我相信它会避免fieldset
验证。