【问题标题】:Django Admin - Dynamically pick list_display fields (user defined)Django Admin - 动态选择 list_display 字段(用户定义)
【发布时间】:2018-07-11 04:21:00
【问题描述】:

我的一些模型有很多字段,用户可能不需要在任何给定时间点查看所有字段。我正在尝试添加功能以允许用户选择从前端显示哪些字段,而无需更改 admin.py 文件中的 list_display 定义。我也不想只为他们倾倒所有的字段。

我希望有人能指出我在 github 上的一些东西,或者给我一些关于如何去做的建议。

提前致谢。

我不是指基于角色的视图。我所说的是用户从前端按需定义字段。因此,如果我有字段 A、B、C 和 D。我可以说只从管理 UI 中显示 A 和 D。然后明天我可能想添加 C 字段。我在管理员之外使用 JavaScript 来完成此操作,但不想陷入不必要的覆盖管理员模板的混乱中。

【问题讨论】:

  • 不是重复的。那是我知道并且可以实现的基于角色的引用显示。我所说的是用户从前端按需定义字段。因此,如果我有字段 A、B、C 和 D。我可以说只从管理 UI 中显示 A 和 D。然后明天我可能想添加 C 字段。我在管理员之外使用 JavaScript 来完成此操作,但如果我没有必要,我不想陷入覆盖管理员模板的混乱之中。

标签: python django django-admin


【解决方案1】:

这是一个指向通用解决方案的指针,该解决方案可为您提供大量控制。这并没有做任何非常有用的事情,但向您展示了如何通过查看正在显示的对象列表在运行时动态更改列的几乎所有内容。将此与request.session 结合起来,我认为您可以做您想做的事...更改要显示的列数,更改列的标题和内容,所有这些都在运行时进行。

class DynamicColumn():

    def __init__(self, qs:QuerySet):
        self.qs = qs
        # Analyze the queryset to decide what to show
        self.__name__ = "Dynamic column title"

    def __call__(self, widget:Widget) -> str:
        # Take the model instance and return something to display
        return f"This QS has {len(self.qs)} items"


class WidgetAdmin(admin.ModelAdmin):
    list_display = (
        'name',
        'price',
        'stock',
    )

    def get_list_display(self, request):
        qs = self.get_queryset(request)
        dc = DynamicColumn(qs)
        out = list(self.list_display)
        out.append(dc)  # Add multiple different instances if you want
        return out

【讨论】:

  • 你在这里救了我的命,你太棒了!!
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 2013-03-07
  • 2016-01-05
  • 1970-01-01
  • 2012-01-08
  • 2019-11-02
  • 2012-05-29
  • 1970-01-01
相关资源
最近更新 更多