【发布时间】: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。很棒的指南。