Так что я уже некоторое время борюсь с этим:
Контекст:
У меня есть форма оплаты за переезд в различные пригороды города. Если водитель предпочитает цитировать по запросу, он оставит плату за переезд для этого пригорода незаполненной. При редактировании своих сборов за переезд водитель также может удалить сбор, если он хочет начать расценки по запросу.
В настоящее время: Я заставил это работать, используя аргумент can_delete набора форм. Однако при рендеринге отдельных форм так:
<table>
<th>Area</th><th>Relocation Fee</th><th>Remove</th>
{% for relocation_form in relocation_form_set %}
<tr> {{ relocation_form }}</td> </tr>
{% endfor %}
</table>
Расположение не идеальное. Флажок удаления и его метка, кажется, создаются в отдельной строке таблицы, когда я хочу, чтобы она находилась в той же строке, что и поле ввода платы за пригород и переезд, которое выглядит следующим образом:
Идеальное расположение
Итак, я могу добиться этого, выложив форму вручную:
<table>
<th>Area</th><th>Relocation Fee</th><th>Remove</th>
{% for relocation_form in relocation_form_set %}
<tr><td>{{ relocation_form.price.label }}</td><td>{{ relocation_form.price }}</td><td>{{ relocation_form.DELETE }}</td></tr>
{% endfor %}
</table>
Однако это вызывает новую проблему. В первом шаблонном коде пустые наборы форм не требовались (это то, что я хочу). С новым блоком formset выдает ошибку проверки для каждой формы, которая остается пустой.
Дополнительная информация:
Если я не пропустил ничего очевидного, может быть полезно следующее. Набор форм перемещения создается следующим образом:
RelocationFormSet = forms.inlineformset_factory(Cars, RelocationPrice, form=RelocationPriceForm,formset=FormSetWithInstances,
extra=len(list_of_suburbs),can_delete=True)
Где RelocationPriceForm
- это форма модели, а FormSetWithInstances
- это класс, который расширяет BaseInlineFormset
, позволяя создать экземпляр формы с помощью списка форм, например:
RelocationFormSet(request.POST, instance=car, form_kwargs={'instances': list_of_models})
Одна из других прикольных вещей, которые я делаю: я скрываю поле пригорода, устанавливая начальное значение для каждого и меняя название платы за переезд на название пригорода. Последние два выполняются с помощью следующих функций:
def changeFormSetLabels(form_set, list_of_labels, field_name):
for i, label in enumerate(list_of_labels):
form_set[i].fields[field_name].label = label
return form_set
def changeFormSetInitialValues(form_set,list_of_labels, field_name):
for i, label in enumerate(list_of_labels):
form_set[i].fields[field_name].initial = label
return form_set
Я не уверен, связано ли это с моей проблемой, но я вполне уверен, что это неправильный способ сделать это. Так что основные бонусные баллы, если вы также можете указать мне в правильном направлении, чтобы сделать это правильно.
Спасибо!