【问题标题】:Django admin - Limit the choices in dropdownDjango admin - 限制下拉列表中的选择
【发布时间】:2017-01-26 18:41:01
【问题描述】:

我现在开始使用 django,但在尝试根据用户信息过滤数据时遇到问题。让我解释一下我的应用程序是如何工作的。我的应用程序中的用户属于一家公司。所以我创建了一个名为 Company 的表来捕获公司信息。然后我创建了另一个名为 UserCompany 的表。基本上,它存储来自 Django User 的 Id 和来自我公司表的 Id。现在,我想根据他们的公司 ID 过滤用户将在 Django Admin 中看到的数据。他/她只能查看基于其公司 ID 的数据。我能够在 admin.py 中使用 get_queryset 来计算这个用户。我现在唯一的问题是,由于外键而在管理员中显示的下拉列表没有被过滤。我做了一些研究,发现了limit_choices_to。我可以像这样静态设置:

class Cleaner(models.Model):
    company = models.ForeignKey('Company',limit_choices_to = {'companyname' = 'Test'}

管理部分的下拉列表仅显示公司测试。我怎样才能动态地做到这一点?我是在模型中执行还是在 admin.py 中执行?请帮忙!!

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    现在是时候为您的模型设置 CustomAdmin。您将不得不覆盖 ModelAdmin 的 formfield_for_foreignkey 方法

    class CleanerAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
             if db_field.name == "company":
                     kwargs["queryset"] = Company.objects.filter(name='Test')
             return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(Cleaner, CleanerAdmin)
    

    如果有特定于会话的过滤器,您需要参考已登录的用户对象,您还可以参考请求对象。你可以在这里写任何逻辑。

    【讨论】:

    • 您可以使用kwargs['queryset'] = db_field.related_model.objects.filter(name='Test') 不使用硬编码模型
    【解决方案2】:
    @admin.register(Cleaner)
    class CleanerAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
             if db_field.name == "company":
                     kwargs["queryset"] = db_field.related_model.objects.filter(name='Test')
             return super(CleanerAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    

    【讨论】:

    • 这个答案应该有一些解释代码的文字。
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多