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

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

Я пробовал с помощью формы.

Форма:

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

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


person Steve    schedule 07.04.2019    source источник


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

Я надеюсь, что это имеет смысл и поможет вам понять это.

person Jonathan Liuti    schedule 07.04.2019
comment
Спасибо за Ваш ответ. После создания value_forms я передаю его в шаблон и отображаю в форме: <form method="POST" class="post-form">{% csrf_token %} {% for form in value_forms %} {{ form.as_p }} {% endfor %} <button type="submit" class="save btn btn-default">Create</button> В результате у меня есть два поля выбора модели, что нормально, но вернемся к представлению, я получаю в сообщении только значение второго отображается поле. - person Steve; 07.04.2019
comment
Вы должны использовать параметр ˋprefix` при создании формы, см. docs.djangoproject .com/en/2.1/ref/forms/api найдите префикс формы. - person Jonathan Liuti; 08.04.2019