Django Formset的手动模板设置导致验证错误

时间:2018-11-14 21:16:04

标签: python django formset

所以我一直在为此苦苦挣扎:

上下文: 我有一个城市中各个郊区的搬迁费用表格。如果驾驶员希望根据要求报价,他将将该郊区的搬迁费留空。在编辑他的搬迁费时,如果驾驶员希望按要求开始报价,他也可以删除费用。

当前:我已经使用表单集的 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>

布局不理想。当我希望将其与郊区和搬迁费输入字段位于同一行时,删除复选框及其标签似乎在表的单独行上创建:

Ideal Layout

因此,我可以通过手动布置表格来实现:

<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

我不确定这是否与我的问题有关,但是我很确定这不是正确的方法。因此,如果您还可以向我指出正确的方向来正确执行此操作,则可以获得主要的奖励积分。

谢谢!

0 个答案:

没有答案