Django admin - 限制下拉列表中的选项

时间:2017-01-26 18:41:01

标签: python django django-models django-admin

我现在开始使用django,我在尝试根据用户信息过滤数据时遇到问题。让我解释一下我的应用是如何工作的我的应用中的用户属于公司。所以我创建了一个名为Company的表来捕获公司信息。然后我创建了另一个名为UserCompany的表。基本上,它存储来自Django用户的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部分的下拉列表仅显示公司Test。我怎么能动态地这样做?我是在模型中执行此操作还是在admin.py中执行此操作?请帮忙!!

2 个答案:

答案 0 :(得分:3)

现在是时候为您的模型设置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)

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

答案 1 :(得分:0)

@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)