如何有条件地排除django管理员列表显示项

时间:2017-03-06 15:44:36

标签: python django model admin

我的Django管理员中有一个引用模型,我设置了一个管理类,其中包含一些字段的列表显示。其中一个字段是'合作伙伴ID'。我有多个不同的设置文件,这些文件从基本设置文件扩展到我所处的任何环境。在这些设置文件中,还有一个SHOW_PARTNER_ID变量。如果SHOW_PARTNER_ID设置为false,我希望能够从列表显示中删除partner_id,反之亦然。我有一个方法,为报价表的每一行返回一个空字符串,该字符串没有合作伙伴ID,但我宁愿完全删除该列。

class QuoteAdmin(admin.ModelAdmin):
    list_display = ('date', 'device_model', 'first_name', 'last_name', 'customer_address', 'customer_link',
                    'customer_history', 'site_name', 'status', 'partner_id')

    def partner_id(self, obj):
            from django.conf import settings
            try:
                if settings.SHOW_PARTNER:
                    if obj.partner:
                        return u'<a href="/admin/quote/partner/{}/">{}</a>'.format(obj.partner.id, obj.partner.id)
                    else:
                        return ''
                else:
                    return ''
            except Exception as e:
                logging.error(e)
                return ''

1 个答案:

答案 0 :(得分:4)

覆盖模型管理员的get_list_display方法。原作&#39; (source)只返回class属性:

def get_list_display(self, request):
    """
    Return a sequence containing the fields to be displayed on the
    changelist.
    """
    return self.list_display

只需实现任何更复杂的逻辑,例如根据此处的设置添加/删除字段,例如:

def get_list_display(self, request):
    if not settings.SHOW_PARTNER:
        return self.list_display[:-1]
    return self.list_display