Django条件管理list_editable

时间:2015-10-29 13:48:49

标签: 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

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
    )

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

此外,您可以覆盖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

答案 2 :(得分:0)

如上所述,<html> <head> <title>page4</title> <style> #container { width:1200px; height:700px; margin-left:auto; margin-right:auto; background-color:grey; } #image1 { background-color: red; height:140px; width:300px; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #image2 { background-color: orange; height:140px; width:300px; float: left;; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #image3 { background-color: yellow; height:140px; width:300px; float: left; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #image4 { background-color: blue; height:140px; width:300px; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #image5 { background-color: green; height:140px; width:300px; float:right; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #image6 { background-color: lightgreen; height:140px; width:300px; float: right; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #image7 { background-color: purple; height:140px; width:300px; float: left;; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #image8 { background-color: maroon; height:140px; width:300px; float: left; font-size:40px; line-height:140px; text-align:center; letter-spacing:10px; } #footer { background-color: lime; height:140px; width:1200px; float:right; font-size:40px; line-height:150px; text-align:center; letter-spacing:10px; } #content { background-color: pink; height:560px; width:600px; font-size:40px; line-height:290px; text-align:center; letter-spacing:10px; float:left; } </style> </head> <body> <div id="container"> <div id="image1"> image1 </div> <div id="image5"> image5 </div> <div id="content"> Content</div> <div id="image6"> image6 </div> <div id="image7"> image7 </div> <div id="image8"> image8 </div> <div id="image2"> image2 </div> <div id="image3"> image3 </div> <div id="image4"> image4 </div> <div id="footer"> footer </div> </div> </body> </html> 类中没有get_list_editable方法,但是可以很容易地实现它(在ModelAdmin上测试):

django==2.1