【发布时间】:2018-05-14 16:24:03
【问题描述】:
我有一个基于模型表单集 (forms.py) 的 Django 站点。我的观点(views.py)选择了模型表单集。该视图在我的模板 (alerts.html) 中呈现。用户会看到填充了实体和逻辑的警报列表。他们必须在表单集中的一个或多个表单上输入评论,然后单击提交按钮将一个或多个表单发布到数据库。当前单击提交按钮时,页面刷新并在runserver中显示成功的POST(200),但数据未保存到DB。 formset.errors 表明每个字段都需要comment,而不仅仅是更改的表单。
我尝试在调用formset.save() 之前添加if formset.has_changed():,但问题仍然存在。
我应该如何更改我的项目以允许正确保存模型表单集?
编辑:我迁移blank=True 以征求意见。现在,当单击提交按钮时,数据将被保存。但是,注释文本(以及表单的其余部分)仍保留在模板的表格中。再次点击提交时,评论文本仍然存在,entity 和logic 被替换为空白。
forms.py
class AlertForm(ModelForm):
class Meta:
model = Alert
fields = [
'comment'
]
AlertFormSet = modelformset_factory(Alert, extra=0, form=AlertForm)
views.py
def alerts(request):
newAlerts = Alert.objects.filter(comment='')
formset = AlertFormSet(request.POST or None, queryset=newAlerts)
context = {'formset':formset}
if request.method == 'POST':
formset = formset
if formset.is_valid():
formset.save()
else:
formset = formset
print(formset.errors)
return render(request, 'alerts/alerts.html', context)
alerts.html
<form method='POST' action=''>
{{ formset.management_form }}
{% csrf_token %}
<input name="submit" value="Submit" id="submit-id-submit" type="submit">
{% for form in formset %}
{% for hidden_field in form.hidden_fields %}
{{ hidden_field }}
{% endfor %}
{% endfor %}
<table>
<thead>
<tr>
<th>Entity</th>
<th>Logic</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
{% for form in formset %}
<tr>
<td>{{ form.instance.entity }}</td>
<td>{{ form.instance.logic }}</td>
<td>{{ form.comment }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</form>
【问题讨论】:
-
我编辑了我的答案希望它可以帮助你解决问题
-
@ZachB。谢谢您的帮助!但是,我之前已经走上了循环表单的道路,我真的很想坚持提交整个表单集。我知道这是可能的(我从那里得到视图代码):docs.djangoproject.com/en/1.11/topics/forms/modelforms/…
-
您希望
entity和logic可编辑吗?您似乎没有在模板中包含这些字段。您没有在模板中包含任何错误——它们会提示问题所在。如果您循环通过{% for form in formset %}而不是{% for field in formset %},则不会那么混乱。 -
不,只有评论需要可编辑。我会将
field更改为form以减少混乱 - 谢谢!我正在使用field.instance.entity和field.instance.logic,因为它们是外键字段,我希望看到相关的文本而不是随机的 id 数字 -
您已将循环更改为
{% for form in formset %},但您仍然在循环内使用field,例如{{ field.instance.entity }}
标签: python django django-forms django-templates django-views