编辑:原来我的表单未通过验证。我认为在其他视图中添加了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}}渲染表单集,它确实可以保存,但是我无法手动渲染字段。
答案 0 :(得分:0)
原来,我的表单未通过验证。我认为在其他视图中添加了print(formset.errors),这表明我的必填字段尚未填写。