限制显示在Django管理员选择框中的值

时间:2019-01-10 10:08:37

标签: python django

在Django 1.11中,我有2个模型,FooBar

class Foo(models.Model):
    name = models.CharField()
    extra = models.BooleanField(default=False)

class Bar(models.Model):
    name = models.CharField()
    extra_foo = models.ForeignKey(Foo)

我的admin.py如下:

class BarInline(admin.StackedInline):
    model = Bar
    fields = ('name', 'extra_foo')

class FooAdmin(admin.ModelAdmin):
    fields('name')
    inlines = [BarInline]

我的问题是在直列式窗体中,extra_foo的下拉列表显示了我现有Foo all 。我希望它仅显示Fooextra的{​​{1}}个。如何修改管理员以将选择框中的可用选项限制为整个子集?

2 个答案:

答案 0 :(得分:3)

我想,您可以使用render_change_form

class FooAdmin(admin.ModelAdmin):
     def render_change_form(self, request, context, *args, **kwargs):
         context['adminform'].form.fields['extra_foo'].queryset = Foo.objects.filter(extra=True)
         return super(FooAdmin, self).render_change_form(request, context, *args, **kwargs)

admin.site.register(Foo, FooAdmin)

如果您希望将其设为全局,请查看limit_choices_to

extra_foo = models.ForeignKey(Foo, limit_choices_to={'extra': True})

信用:filter foreignkey field in django admin

答案 1 :(得分:3)

您可以使用limit_choices_to来实现。更改此行:

extra_foo = models.ForeignKey(Foo)

收件人:

extra_foo = models.ForeignKey(Foo, limit_choices_to={'extra': True})

这会将extra_foo的选择限制为Foo属性设置为extra的{​​{1}}个对象。

但是,这种方法不仅会限制管理员的选择,还会限制其他选择。如果您只需要调整管理员,则可以使用其他方法。