Django模型表单设置POST但不保存

时间:2017-11-30 16:50:53

标签: python django django-forms django-templates django-views

我有一个基于模型formset(forms.py)构建的Django站点。模型表单集由我的视图(views.py)选取。视图在我的模板(alerts.html)中呈现。用户会看到填充了实体和逻辑的警报列表。他们必须在表单集中的一个或多个表单上输入注释,然后单击“提交”按钮将一个或多个表单发布到数据库。当前单击提交按钮时,页面刷新并在runserver中显示成功的POST(200),但数据未保存到DB。 formset.errors表示每个字段都需要comment,而不仅仅是已更改的表单。

我在调用if formset.has_changed():之前尝试添加formset.save(),但问题仍然存在。

如何更改项目以允许正确保存模型表单?

编辑:我已迁移blank=True以征求意见。现在,单击提交按钮时,将保存数据。但是,注释文本(以及表单的其余部分)仍保留在模板的表中。再次点击提交时,评论文字仍然存在,entitylogic将替换为空白。

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>

2 个答案:

答案 0 :(得分:2)

表单集无效,因为您未提交entitylogic字段的值。如果您在视图中打印formset.errorsincluded the form errors in the template,则会看到此内容。

由于您不希望entitylogic可编辑,因此您不应将这些内容包含在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()