Django条件管理list_editable

trb*_*trb 9 django django-admin

反正是在每个对象基础上使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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

使用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
    )
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 4

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

尝试重写该get_changelist_formset方法。我认为您需要复制整个方法,并更改传递给modelformset_factory.