Django 自定义模型管理员:是否允许管理员类验证忽略字段集中的字段?

Django 自定义模型管理员:是否允许管理员类验证忽略字段集中的字段?,django,django-admin,django-forms,Django,Django Admin,Django Forms,我正在编写一个小应用程序,允许django管理员更改列表中的共享字段允许用户共享他们当前正在编辑的对象(以及查看共享计数): 以一个简单的BlogEntry为例,我创建了一个定制的ModelAdmin: class AddThisAdmin(admin.ModelAdmin): addthis_config = { 'title_field' : None, 'description_field' : None, 'url_field'

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

以一个简单的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\u config
允许用户指定BlogEntry对象中的字段,从中提取addthis中使用的标题/描述/url和图像。在我决定在BlogEntryAdmin中使用自定义字段集之前,这一切都非常有效:

class BlogEntryAdmin(admin.ModelAdmin, AddThisAdmin):
    addthis_config = {
        'title_field' : 'blog_title',
        'description_field' : 'blurb',
    }
    fieldsets = [{ ... }]
'BlogEntry.fieldsets['fields']'指表单中缺少的字段'add_this'

我知道这是因为django管理员在BlogEntryAdmin类实际实例化(并插入我的自定义字段)之前对其字段集(django.contrib.admin.validation)运行验证


tldr:是否有办法让
django.contrib.admin.validation
忽略字段集中的字段

典型的方法是提供基本表单,如
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

典型的方法是提供基本表单,如
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

它没有文档记录,但您可以使用
get_fieldset
方法定义字段集。例如,查看Django在添加新用户时如何更改中的字段集


我没有对此进行测试,但我相信它将避免
字段集
验证

它没有文档记录,但是您可以使用
get\u fieldset
方法来定义您的字段集。例如,查看Django在添加新用户时如何更改中的字段集


我没有对此进行测试,但我相信它将避免
字段集
验证

是的,我想对其进行设置,以便在从AddThisModelAdmin继承后自动插入额外字段,从而使其尽可能可重用。上述情况似乎仍然会导致相同的错误。据我所知,
django.admin.validator
在任何ModelAdmin被实例化之前被调用,它使用一些类方法来执行验证,这意味着get\u form直到这个过程之后才被调用?我不是100%确定,虽然我将此标记为已接受,因为我最终按照您在回答的第一部分中的建议进行了操作:创建了一个AddThisForm,它添加了一个字段,并在对象未保存时有条件地隐藏整行(使用带有javascript的小部件)。感谢您的帮助Yea,我想设置它,以便在从AddThisModelAdmin继承后自动插入额外字段,以便尽可能地重用它。上述情况似乎仍然会导致相同的错误。据我所知,
django.admin.validator
在任何ModelAdmin被实例化之前被调用,它使用一些类方法来执行验证,这意味着get\u form直到这个过程之后才被调用?我不是100%确定,虽然我将此标记为已接受,因为我最终按照您在回答的第一部分中的建议进行了操作:创建了一个AddThisForm,它添加了一个字段,并在对象未保存时有条件地隐藏整行(使用带有javascript的小部件)。感谢您的帮助,我注意到了这一点,但我正在尝试编写它,这样我就可以简单地从AddThisModelAdmin继承,而不必做任何其他事情(为了将来的resue)。有了这个方法(据我所知?),我需要在每个模型管理员中覆盖
get\u fieldset
方法,我想使用这个字段(以及继承AddThisModelAdmin),你需要平衡可重用性和实现它所需的魔法/丑陋性。猴子补丁
验证
?如果您希望保留
ModelAdmin
验证的其余部分,则可能需要大量重复。
AddThisAdmin
上的某个元类魔法删除了
fieldset
属性,并添加了一个替换的
get\u fieldset
方法?当您试图处理实现
get\u fieldset
ModelAdmin
时,一开始很棘手,然后甚至更棘手。祝你好运,这是一个很好的观点。我可能过度考虑了整个事情的可重用性方面。用javascript提供一个被覆盖的模板,并通过modeladmin change_视图或其他方式提供变量可能会更容易。感谢您的帮助,我注意到了这一点,但我正在尝试编写它,这样我就可以简单地从AddThisModelAdmin继承,而不必做任何其他事情(为了将来的resue)。有了这个方法(据我所知?),我需要在每个模型管理员中覆盖
get\u fieldset
方法,我想使用这个字段(以及继承AddThisModelAdmin),你需要平衡可重用性和实现它所需的魔法/丑陋性。猴子补丁
验证
?如果您希望保留
ModelAdmin
验证的其余部分,则可能需要大量重复。
AddThisAdmin
上的某个元类魔法删除了
fieldset
属性,并添加了一个替换的
get\u fieldset
方法?当您试图处理实现
get\u fieldset
ModelAdmin
时,一开始很棘手,然后甚至更棘手。祝你好运,这是一个很好的观点。我可能过度考虑了整个事情的可重用性方面。可能吧