如何在Django CreateView中限制ForeignKey字段的选择?

时间:2017-11-08 14:29:06

标签: python django

我有这样的模型结构:

# models.py
class Foo(models.Model):
    ...

class Bar(models.Model):
    foo = models.ForeignKey(Foo)
    ...

class Baz(models.Model):
    bar = models.ForeignKey(Bar)
    ...

现在,在DetailViewFoo个实例上,我有一个创建Baz的链接 属于Foo实例的实例(通过其Bar个实例之一)。 该链接指向以下CreateView

class BazCreateView(CreateView):
    model = Baz
    fields = ['bar', ...]

由于要创建的Baz实例属于foo的Bar实例之一, 我想将该字段的选择限制为属于foo的Bar实例。

到目前为止,我发现ForeignKey.limit_choices_to似乎是在模型中使用的 This question 这是9岁,因此可能有一个过时的答案。如果它没有过时,我想了解如何访问接受的答案中提到的form对象以及如何将Bar id传递给CreateView。

1 个答案:

答案 0 :(得分:2)

在看了@Alasdair指出的问题后(​​感谢提示),我提出了这个问题:

# forms.py
class BazForm(models.ModelForm):
    model = Baz
    fields = ['bar', ...]

    def __init__(self, *args, **kwargs):
        foo_id = kwargs.pop('foo_id')
        super(BazForm, self).__init__(*args, **kwargs)
        self.fields['bar'].queryset = Bar.objects.filter(foo_id=foo_id)

# views.py
class BazCreateView(CreateView):
    form_class = BazForm
    model = Baz

    def get_form_kwargs(self):
        kwargs = super(BazCreateView, self).get_form_kwargs()
        kwargs.update({'foo_id': self.kwargs.get('foo_id')})
        return kwargs

这似乎有效。如果我在这里做错了,请发表评论。