多个表单的表单集
好的,我在学习表单集(formset)。基本上我明白表单集是用来处理多个表单的。
在这个例子中,我想同时获取四个值,但在HTML输出中只显示了一个表单。
我是不是需要像这样添加额外的字段 <input id="your_name" type="text" name="your_name">
,还是说Django会自动处理这些,或者有没有其他方法可以做到呢?
models.py
class Article(models.Model):
title = models.CharField(max_length=100)
pub_date = models.DateField(auto_now_add=True)
forms.py
class ArticleForm(forms.Form):
title = forms.CharField()
#pub_date = forms.DateField()
ArticleFormSet = formset_factory(ArticleForm, extra=4, validate_max=True)
views.py
def book(request):
if request.method == 'POST':
formset = ArticleForm(request.POST)
if formset.is_valid():
new = Article()
new.title = request.POST.get('title', None)
#new.pub_date = request.POST.get('pub_date', None)
new.save()
return HttpResponseRedirect(reverse('firstapp.views.book'))
else:
formset = ArticleForm()
return render_to_response('get.html',{'formset': formset}, context_instance = RequestContext(request))
而HTML看起来是这样的
<form method="post" action="">
{% csrf_token %}
{{ formset.management_form }}
<table>
{% for form in formset %}
{{ form }}
{% endfor %}
</table>
<input type="submit"/>
</form>
1 个回答
1
在你的视图中,你把 formset
绑定到了 ArticleForm
,而不是 ArticleFormSet
。而且你只是在创建一个单独的 Article
,并且你没有正确使用 form
(也就是说,你直接从 request.POST
中获取 title
,而不是从你表单的 cleaned_data
中获取)。你的视图代码应该像下面这样(注意:这段代码没有经过测试,可能有问题,但至少你能明白大概意思)。
def book(request):
if request.method == 'POST':
formset = ArticleFormSet(request.POST)
if formset.is_valid():
for data in formset.cleaned_data:
Article.objects.create(title=data['title'])
return HttpResponseRedirect(reverse('firstapp.views.book'))
else:
formset = ArticleFormSet()
return render_to_response('get.html',{'formset': formset},
context_instance = RequestContext(request))
最后,我强烈建议你看看 ModelForms
。