0

我想同时显示几个模型选择字段,每个模型都包含来自同一模型但具有不同查询集的数据。为此,我应该使用一个表单集还是多个表单传递给模板?

我已经尝试过使用表单集。

形式:

class ValueForm(forms.Form):
    value = forms.ModelChoiceField(queryset = ValueTable.objects.all())

看法:

filter_value1 = ValueTabel.objects.filter(group = 1)
filter_value2 = ValueTabel.objects.filter(group = 3)
TmpFormSet = formset_factory(ValueForm, extra=0)
form = TmpFormSet(queryset=filter_value1,filter_value2)

这是我在数据库中的记录:

ValueTable(group, value):
1, Value1
1, Value2
1, Value3
2, Value4
3, Value5
3, Value6


Group(group, attribute)
1, attribute1
2, attribute2
3, attribute1

选择模型组(记录 1 和 3)上的属性 1,我将同时显示两个具有以下选项的表单:

modelchoicefield 1:
Value1
Value2
Value3

modelchoicefield 2:
Value5
Value6

如何手动将两个查询集添加到表单集中?

4

1 回答 1

1

表单集用于为每个模型实例显示一个表单,并且只允许您为所有实例设置自定义参数。

您在这里尝试实现的是动态设置每个实例的值字段的查询集(也就是每个实例都不相同),所以我不相信您能够使用表单集实现您想要的。

只需创建一个循环并通过将正确的查询集传递给每个表单字段来手动实例化每个表单。

使用您提供的示例,它看起来像这样:

value_queryset1 = ValueTabel.objects.filter(group = 1)
value_queryset2 = ValueTabel.objects.filter(group = 3)
value_querysets = [value_queryset1, value_queryset2]
value_forms = []

for value_queryset in value_querysets:
    value_form = ValueForm()
    value_form.fields["value"].queryset = value_queryset
    value_forms.append(value_form)

您还可以覆盖 的init方法,ValueForm使其看起来不那么凌乱,但从技术上讲,它们是相同的。

我希望它是有道理的,并帮助你解决这个问题。

于 2019-04-07T17:42:08.890 回答