如何使用具有来自不同查询集的值的 Modelchoice 字段创建 Django form/formset

how to create a Django form/formset with Modelchoice fields having values from different querysets

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

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

表格:

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

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

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

你在这里想要实现的是动态设置每个实例的值字段的查询集(也就是每个实例都不一样),所以我不相信你能实现你想要的带有表单集。

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

根据您给出的示例,它看起来像这样:

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)

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

我希望它有意义并能帮助您解决这个问题。