多个表单的表单集

0 投票
1 回答
580 浏览
提问于 2025-04-18 14:34

好的,我在学习表单集(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

撰写回答