自定义ModelAdmin:允许管理员类验证忽略字段集中的字段?

时间:2011-11-15 17:04:15

标签: django django-admin django-forms

我正在编写一个小应用程序,允许django管理员更改列表中的AddThis共享字段允许用户共享他们当前正在编辑的对象(以及查看共享计数):

enter image description here

以一个简单的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忽略字段集中的字段?

2 个答案:

答案 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验证。