我有这样的模型结构:
# models.py
class Foo(models.Model):
...
class Bar(models.Model):
foo = models.ForeignKey(Foo)
...
class Baz(models.Model):
bar = models.ForeignKey(Bar)
...
现在,在DetailView
个Foo
个实例上,我有一个创建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。
答案 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
这似乎有效。如果我在这里做错了,请发表评论。