在Django 1.11中,我有2个模型,Foo
和Bar
:
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 。我希望它仅显示Foo
是extra
的{{1}}个。如何修改管理员以将选择框中的可用选项限制为整个子集?
答案 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})
答案 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}}个对象。
但是,这种方法不仅会限制管理员的选择,还会限制其他选择。如果您只需要调整管理员,则可以使用其他方法。