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

标签 python django django-models django-admin

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

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

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

最佳答案

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

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

关于python - Django admin - 限制下拉列表中的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41880634/

相关文章:

python - sqlite3.操作错误: wrong number of arguments to function

Python:更改大写字母

javascript - Spidermonkey 中的文件 I/O

python - Lxml html xpath 上下文

python - Django和并行处理:

python - 如何在 django 表单的查询集上使用切片?

python - 我应该如何将这个又长又复杂的 PHP 样式 URL 查询字符串转换为 Django url?

django 如何在同一编辑帖子上创建帖子后重定向 url

python - Django 说该表不存在

python - Django 管理员选择与默认模型排序不同的排序