как создать форму / набор форм Django с полями Modelchoice, имеющими значения из разных наборов запросов - PullRequest
0 голосов
/ 07 апреля 2019

Я хотел бы отобразить одновременно несколько полей выбора модели, каждое из которых содержит данные из одной и той же модели, но с разными наборами запросов.Для этого я должен использовать один набор форм или несколько форм для передачи в шаблон?

Я пробовал с набором форм.

Форма:

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 в группе моделей (записи 1 и 3) я бы отобразил одновременно две формы со следующими вариантами выбора:

modelchoicefield 1:
Value1
Value2
Value3

modelchoicefield 2:
Value5
Value6

Как вручную добавить в набор два набора запросов?

1 Ответ

1 голос
/ 07 апреля 2019

Набор форм используется для отображения одной формы для каждого экземпляра модели и позволяет устанавливать настраиваемые параметры только для всех экземпляров.

Здесь вы пытаетесь достичь динамической установки набора запросов для поля значения в соответствии сэкземпляр (иначе он не одинаков для каждого экземпляра), поэтому я не верю, что вы сможете достичь того, что вы хотите, с помощью набора форм.

Просто создайте цикл и создайте экземпляр каждой формы вручную, передав соответствующуюнабор запросов к каждому полю формы.

В приведенном вами примере он будет выглядеть примерно так:

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, чтобы сделать еговыглядят немного менее грязно, но технически они одинаковы.

Надеюсь, это имеет смысл и поможет вам разобраться в этом.

...