gpt4 book ai didi

django - 如何在 Django admin 中实现全局隐式过滤器?

转载 作者:行者123 更新时间:2023-12-01 01:30:06 26 4
gpt4 key购买 nike

我的很多模型都有“公司”模型的外键。每个登录用户都可以是一个或多个公司的一部分(用户 m2m 公司,不为空)。

我希望当前管理员用户在管理员索引页面或基本标题上打开“公司护目镜”,即选择列表,他们可以在其中切换“当前”公司。这样做应该自动应用“公司等于”过滤器 - 对于具有公司外键的模型 - 除了任何其他过滤器。

实现这一目标的最佳方法是什么?

注意:这意味着作为管理界面的舒适功能,在这个阶段不需要对模型进行实际保护(客户端 View 确实需要,但我可以使用自定义管理器并通过 request.user 在那里查找)。

我目前的想法是:

  • 在 session 中存储当前公司。
  • 使用中间件从 session 中查找当前公司,并将公司附加到所有相关链接:

    a) change_list: (?/&)"company__eq=42"

    b) change_view "add?company=42"用于具有公司外键的模型。

    这可能需要反向或模式匹配 URL 以找出它们的模型并检查它是否存在外键(或者我可能会事先准备该列表以提高性能)。
  • 在每个 ModelAdmin 表单中包含外键字段,但通过 CSS 将其隐藏,以便 change_view add ("new") 包含来自链接的预设外键值而不提及它。

  • 你觉得这是一种可行的方法吗?

    如果 http://code.djangoproject.com/ticket/10761已实现我想我可以指定一个自定义查询集,它从 request.session 读取当前公司并完成它。也许更好地快速跟踪(=制作并提交补丁)该票?

    编辑:或者也许只是在每个需要它/具有外键的 ModelAdmin 上重新定义 queryset() 方法?

    最佳答案

    我的投票是覆盖 ModelAdmin.queryset ,因为您可以方便地访问那里的请求。覆盖 save_model对于第 3 点。

     class MyModelAdmin(admin.ModelAdmin):
    def queryset(self, request):
    qs = super(MyModelAdmin, self).queryset(request)
    if request.session.get('company_goggles'):
    return qs.filter(company=request.session['company_goggles'])
    return qs

    如果你有很多模型,我会继承 ModelAdmin就像 GogglesAdmin并定义一个字段/默认值以从中提取字段名称以及公司的预保存自动注入(inject)。
    class CompanyGogglesAdmin(admin.ModelAdmin):
    def queryset(self, request):
    qs = super(CompanyGoggleAdmin, self).queryset(request)
    if request.session.get('company_goggles'):
    return qs.filter(**{ getattr(self, 'company_field', 'company') :
    request.session['company_goggles'] })

    顺便说一句,我真的很喜欢这个“公司护目镜”的术语。

    关于django - 如何在 Django admin 中实现全局隐式过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5344544/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com