【问题标题】:Django conditional admin list_editableDjango 条件管理员 list_editable
【发布时间】:2016-01-29 16:51:49
【问题描述】:

有没有办法让 list_editable 在每个对象的基础上都是可选的?比如readonly fields属性就有这个选项,不影响changelist_view。

class MyAdmin(admin.ModelAdmin):
    readonly_fields = ('foo',)

    def get_readonly_fields(self, request, obj=None):
        fields = super(MyAdmin, self).get_readonly_fields(request, obj=obj)

        if obj.status == 'CLOSED':
            return fields + ('bar',)
        return fields

list_display 和其他一些属性也可以实现同样的效果。似乎没有方法“get_list_editable_fields”。

我希望某些行显然是不可变的,但除了引发粗俗错误之外似乎不起作用。我也没有找到任何关于该属性的文档

是否可以通过 list_display getter 以某种方式呈现小部件?

class MyAdmin(admin.ModelAdmin):
    list_display = ('get_bar',)
    list_editable = ('get_bar',)

    def get_bar(self, obj):
        return widget or str(obj.bar)  # ???
    get_bar.allow_tags = True

使用 Alasdair 的反馈进行更新:

def get_changelist_formset(self, request, **kwargs):
    """
    Returns a FormSet class for use on the changelist page if list_editable
    is used.
    """
    # I run through this code for each row in the changelist, but there's nothing in kwargs, so I don't know how to use the instance as a guide to which fields should be in list_editable?

    defaults = {
        "formfield_callback": partial(self.formfield_for_dbfield, request=request),
    }
    defaults.update(kwargs)
    return modelformset_factory(
        self.model, self.get_changelist_form(request), extra=0,
        fields=self.list_editable, **defaults
    )

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    正如你所说,没有get_list_editable 方法。

    尝试覆盖get_changelist_formset 方法。我认为您需要复制整个方法,并将传递的字段列表更改为modelformset_factory

    【讨论】:

    • 不明白方法中如何获取当前实例,每一行都跑一遍方法,但是kwargs是空的?查看我更新的问题
    • 我不确定答案是什么,您对管理代码的了解非常深入!您可能还需要覆盖get_changelist_form。祝你好运!
    • 这让我走上了正轨。我最终在管理员上注册了模型两次(这需要代理模型破解)并创建自己的管理员规则集。这个要求确实触及了 django 管理员的界限 :-)
    • @trb 谢谢。我正在尝试完成完全相同的事情。您的解决方案如何?你介意分享代码吗?谢谢。
    • @André 我认为 OP 的意思是这样的,我遇到了同样的问题,我真的认为 django 应该在某个时候支持通用要求 :-) stackoverflow.com/questions/2223375/…
    【解决方案2】:

    如前所述,ModelAdmin 类中没有get_list_editable 方法,但可以轻松实现它(在django==2.1 上测试):

    class MyAdminClass(admin.ModelAdmin):
    
        def get_list_editable(self, request):
            """
            get_list_editable method implementation, 
            django ModelAdmin doesn't provide it.
            """
            dynamically_editable_fields = ('name', 'published', )
            return dynamically_editable_fields
    
        def get_changelist_instance(self, request):
            """
            override admin method and list_editable property value 
            with values returned by our custom method implementation.
            """
            self.list_editable = self.get_list_editable(request)
            return super(MyAdminClass, self).get_changelist_instance(request)
    

    【讨论】:

      【解决方案3】:

      另外,您可以覆盖 changelist_view 并执行类似操作:

         def changelist_view(self, request, extra_context=None):
             resp = super(CustomModelAdmin, self).changelist_view(request, extra_context)
             if something:
                 resp.context_data['cl'].formset = None
      
             return resp
      

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 2013-03-17
        • 2018-08-03
        • 1970-01-01
        • 2022-07-09
        • 2010-10-12
        • 2011-07-21
        • 1970-01-01
        • 2014-12-13
        相关资源
        最近更新 更多