Я хотел бы одновременно отображать несколько полей выбора модели, каждое из которых содержит данные из одной и той же модели, но с разными наборами запросов. Для этого я должен использовать один набор форм или несколько форм для перехода к шаблону?
Я пробовал с помощью формы.
Форма:
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
Как я могу вручную добавить в набор форм два набора запросов?
Набор форм используется для отображения одной формы для каждого экземпляра модели и позволяет вам устанавливать пользовательские параметры только для всех экземпляров.
То, чего вы пытаетесь достичь здесь, - это динамически установить набор запросов поля значения для каждого экземпляра (он же не один и тот же для каждого экземпляра), поэтому я не верю, что вы сможете достичь того, что вы хотите с набором форм.
Просто создайте цикл и создайте экземпляр каждой формы вручную, передав соответствующий набор запросов в каждое поле формы.
В приведенном вами примере это будет выглядеть примерно так:
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
, чтобы он выглядел немного менее беспорядочным, но технически они одинаковы.
Я надеюсь, что это имеет смысл и поможет вам понять это.
Вы должны использовать параметр ˋprefix` при создании экземпляра формы, см. docs.djangoproject.com/en/2.1/ref/forms/api поиск префикса формы.
Спасибо за Ваш ответ. После создания 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>
В результате у меня есть два поля выбора модели, что нормально, но вернемся к представлению, я получаю в сообщении только значение второго отображается поле.