所以我一直在为此苦苦挣扎:
上下文: 我有一个城市中各个郊区的搬迁费用表格。如果驾驶员希望根据要求报价,他将将该郊区的搬迁费留空。在编辑他的搬迁费时,如果驾驶员希望按要求开始报价,他也可以删除费用。
当前:我已经使用表单集的 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>
但是,这导致了新问题。在第一个模板代码中,不需要空的表单集(这是我想要的)。有了新的代码块,表单集就会为每个留空的表单抛出验证错误。
其他信息:
如果我没有错过任何明显的事情,以下内容可能会有所帮助。重定位表单集创建如下:
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
我不确定这是否与我的问题有关,但是我很确定这不是正确的方法。因此,如果您还可以向我指出正确的方向来正确执行此操作,则可以获得主要的奖励积分。
谢谢!