【问题标题】:How to change admin detail view?如何更改管理员详细信息视图?
【发布时间】:2019-10-09 14:00:12
【问题描述】:

我有一个关于 Django-Admin Detail View 的问题。我在管理员 Django 中有一些项目,当我单击它们时,它将显示该特定项目的详细信息。每个项目都有一些状态,可以由用户更改。

现在我要解决问题了...我只想显示相关字段、按钮等,这取决于项目状态或人员类型。我将在特定类下的 admin.py 中放入哪部分代码以使其工作?

我为超级用户尝试了类似的方法,但它不起作用。您能否告诉我如何根据用户状态或项目状态仅显示某些字段(字段名称:模型中的状态...)

class JournalEntriesAdmin(admin.ModelAdmin):
    list_display = ('EngagementCode', 'EngagementManager', 'EngagementIncharge')
    list_filter = ('published', 'EngagementCode')
    search_fields = ('EngagementCode', 'EngagementManager', 'EngagementIncharge')

    def show_relevant(self, obj):
        if request.user.is_superuser:
            fieldsets = (
                    (None, {  # label 1: None
                        'fields': ( # dictionary
                            ('EngagementCode', 'EngagementManager'),

                        )
                    }),
                    ('More details', { # under label 2 : More details
                        'classes': ('collapse',),  # css-class : minimized
                        'fields': (
                            ('published'),
                        )
                    })
                )

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    我认为get_fieldsets 就是您要找的东西

    class JournalEntriesAdmin(admin.ModelAdmin):
        list_display = ('EngagementCode', 'EngagementManager', 'EngagementIncharge')
        list_filter = ('published', 'EngagementCode')
        search_fields = ('EngagementCode', 'EngagementManager', 'EngagementIncharge')
    
        def get_fieldsets(self, request, obj=None):
            if request.user.is_superuser:
                fieldsets = (
                        (None, {  # label 1: None
                            'fields': ( # dictionary
                                ('EngagementCode', 'EngagementManager'),
                            )
                        }),
                        ('More details', { # under label 2 : More details
                            'classes': ('collapse',),  # css-class : minimized
                            'fields': (
                                ('published'),
                            )
                        })
                    )
            else:
                fieldsets = super().get_fieldsets(request, obj)
            return fieldsets
    

    请注意,对于没有字段集,您必须返回字段集或空元组,因此如果用户不是超级用户,您需要决定返回什么。我刚刚在 else 语句中调用了super

    您还可以使用get_fields 控制添加/更改页面上显示的字段。

    此外,如果您想根据用户控制列表视图页面上显示的操作、过滤器和列,您可以分别使用 get_actionsget_list_filterget_list_display

    【讨论】:

    • 感谢更新,但现在我得到:'NoneType' 对象不可迭代,你能帮我修复它吗? @mikeylockwood
    • @webmourek 抱歉错过了退货声明。它需要返回字段集。请注意,对于没有字段集,您将始终需要返回字段集或空元组。因此,如果用户不是超级用户,您将需要决定返回什么。在这种情况下,我现在刚刚打电话给 super
    • 非常感谢。我还有一个想法,我怎么能根据一些价值来做呢?可以说,如果 EngagementManager 的值为“XY”,我想显示一些东西。
    • 是的,我知道,我已经用超级用户而不是超级用户弄清楚了:)
    • @webmourek if obj and obj.EngagementManager == 'XY':。在检查对象上的字段之前,您总是需要检查if obj,因为这将在添加和更改时运行。如果添加对象,obj 将是None 所以obj.EngagementManager 会抛出一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2010-12-06
    • 2011-10-18
    相关资源
    最近更新 更多