django formset不保存

时间:2019-05-30 20:58:08

标签: python django

编辑:原来我的表单未通过验证。我认为在其他视图中添加了print(formset.errors),这表明我的必填字段尚未填写。

我正在尝试在模板中手动呈现表单集字段,但是提交时未保存这些字段。

我的方法适用于基于另一个模型的不同表单集,据我所知,我没有做任何不同的事情。我尝试了许多更改,但是问题似乎是模板中的{{form.id}};当我将其更改为{{form}}时,我可以保存一些字段。

如前所述,相同的设置适用于另一个模型/表单集;当我对字段进行更改并保存时,页面将刷新,并且模型显示为已更新。下面的代码用于无效的模型/表单集。

models.py

class Call(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)
    customer_number = models.CharField(max_length=200, null=True, blank=True)
    tracking_source = models.CharField(max_length=200, null=True, blank=True)
    tracking_number = models.CharField(max_length=200, null=True, 
    qualified_offer = models.BooleanField(default=False)
    recorded_date = models.DateTimeField(default=timezone.now)

    def publish(self):
        self.recorded_date = timezone.now()
        self.save()

    def t_number(self):
        return self.tracking_number[-4:]

    def __str__(self):
        return str(self.name)

forms.py

class CallForm(forms.ModelForm):

    class Meta:
        model = Call
        fields = ('name', 'customer_number', 'tracking_source', 'qualified_offer', 'recorded_date')


CallFormSet = modelformset_factory(Call, fields=('name', 'customer_number', 'tracking_source', 'recorded_date', 'qualified_offer'))

view.py

def call_list(request):

    if request.method == 'GET':
        formset = CallFormSet(queryset=Call.objects.all())
    elif request.method == "POST":
        formset = CallFormSet(request.POST)
        if formset.is_valid():
            for form in formset:
                if form.cleaned_data.get('name'):
                    form.save()
        return redirect('call_list')

    return render(request, 'webapp/call_list.html', {'formset': formset})

call_list.html

{% extends 'webapp/base.html' %}


{% block content %}

<form class="form-horizontal" method="POST" action="">
<table style="width:100%" border="1">
    <tr>
      <th>Name</th>
      <th>Qualified Offer</th>
    </tr>
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
    {{ form.id }}
    <tr>
        <td>
            <label>{{form.name}}</label></td>
        <td>
            <label>{{form.qualified_offer}}</label>
            {% if form.qualified_offer.value %}
                <label>True</label>
            {% else %}
                <label>False</label>
            {% endif %}
        </td>
    </tr>
{% endfor %}

</table>
<div class="row spacer">
    <div class="col-4 offset-2">
        <button type="submit" class="btn btn-block btn-primary">Save</button>
    </div>
</div>

</form>
{% endblock %}

使用上面的代码,页面将刷新,但模型不变。同样,如果我使用{{form}}而不是{{form.id}}渲染表单集,它确实可以保存,但是我无法手动渲染字段。

1 个答案:

答案 0 :(得分:0)

原来,我的表单未通过验证。我认为在其他视图中添加了print(formset.errors),这表明我的必填字段尚未填写。