bgr*_*dev 2 python django django-forms inline-formset
我正在使用内联formset,并且需要在实例化formset时更改其中一个非父模型的表单字段的查询集.
class Foo(Model):
name = models.TextField()
class Bar(Model):
foo = models.ForiegnKey(Foo)
other_model = models.ForeignKey(OtherModel)
class BarForm(ModelForm):
class Meta:
model=Bar
foo = Foo.object.get(id=1)
FormSet = inlineformset_factory(Foo, Bar, form=BarForm)
formset = FormSet(instance=foo)
Run Code Online (Sandbox Code Playgroud)
根据在输入视图代码之前未确定的foo的值,我需要为formForm中的所有表单更改BarForm中'other_model'字段的查询集.有没有办法做到这一点?
如果我理解正确,这就是你可以做的...你可以覆盖BaseInlineFormSet,然后在formset中的每个表单上手动设置该字段的查询集.
所以在你的forms.py中,你会这样做:
class BaseBarFormSet(BaseInlineFormSet):
def __init__(self, other_model_queryset, *args, **kwargs):
super(BaseInlineFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
form.fields['other_field'].queryset = other_model_queryset
Run Code Online (Sandbox Code Playgroud)
请注意__init__的第一个参数是您要设置的查询集.
然后在您查看中,您只需相应地修改当前代码.在工厂函数中传入新的BaseBarFormSet:
FormSet = inlineformset_factory(Foo, Bar, form=BarForm, formset=forms.BaseBarFormSet) # notice formset=forms.BaseBarFormSet
Run Code Online (Sandbox Code Playgroud)
然后将您想要的其他字段的查询集传递给FormSet工厂函数创建的实际类:
formset = FormSet(OtherModel.objects.filter(…), instance=foo) #notice the first parameter
Run Code Online (Sandbox Code Playgroud)
Formsets有时很复杂,所以希望这很有意义......如果你有问题,请告诉我.
| 归档时间: |
|
| 查看次数: |
1555 次 |
| 最近记录: |