【问题标题】:django formset not savingdjango formset 不保存
【发布时间】:2019-10-16 12:58:23
【问题描述】:

编辑:原来我的表单没有通过验证。我在视图中将 print(formset.errors) 添加为 else,这表明我有一个必填字段未完成。

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

我的方法适用于基于另一个模型的不同表单集,据我所知,我没有做任何不同的事情。我尝试了一些更改,但问题似乎是模板中的 {{ 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 }} 呈现表单集,它会保存,但是我无法手动呈现字段。

【问题讨论】:

  • form.qualified_offer 定义在哪里?
  • 抱歉,已将其添加回模型。它在代码中,我在剥离到此处发布时错过了很多字段。
  • “无法手动呈现字段”是什么意思?
  • 我希望能够仅在表格中呈现我想要的字段,但据我所知,如果我只使用 {{ form }] 所有字段都以预定义的方式呈现.
  • 啊。问题标题让我感到困惑。我用this resource。很棒的指南。

标签: python django


【解决方案1】:

原来我的表单没有验证。我在视图中将 print(formset.errors) 添加为 else,这表明我有一个必填字段未完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2023-04-02
    • 2016-11-01
    • 2011-01-27
    相关资源
    最近更新 更多