我有一个基于模型formset(forms.py
)构建的Django站点。模型表单集由我的视图(views.py
)选取。视图在我的模板(alerts.html
)中呈现。用户会看到填充了实体和逻辑的警报列表。他们必须在表单集中的一个或多个表单上输入注释,然后单击“提交”按钮将一个或多个表单发布到数据库。当前单击提交按钮时,页面刷新并在runserver
中显示成功的POST(200),但数据未保存到DB。 formset.errors
表示每个字段都需要comment
,而不仅仅是已更改的表单。
我在调用if formset.has_changed():
之前尝试添加formset.save()
,但问题仍然存在。
如何更改项目以允许正确保存模型表单?
编辑:我已迁移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>
答案 0 :(得分:2)
表单集无效,因为您未提交entity
或logic
字段的值。如果您在视图中打印formset.errors
或included the form errors in the template,则会看到此内容。
由于您不希望entity
或logic
可编辑,因此您不应将这些内容包含在formset的字段中:
class AlertForm(ModelForm):
class Meta:
model = Alert
fields = [
'comment',
]
由于您在表单中定义fields
,因此在致电exclude
时,您不需要包含modelformset_factory
。
AlertFormSet = modelformset_factory(Alert, extra=0, form=AlertForm)
答案 1 :(得分:0)
尝试循环遍历formset中的数据,如下所示
if request.method == 'POST':
formset = formset
if formset.is_valid():
for form in formset:
cleaned_data = form.cleaned_data
entity = cleaned_data.get('entity')
logic = cleaned_data.get('logic')
comment = cleaned_data.get('comment')
# create a new Alert object here
alert = Alert(entity=entity, logic=logic, comment=comment)
alert.save()