user3844732
user3844732

Reputation:

formset for multiple form

ok i am following the formset. Pretty much i understand that formset is for multiple form.

so this example i just want take four values same time but the ouput in html have only one form is showing.

Shall i want to make extra filed like this <input id="your_name" type="text" name="your_name"> or django will do the rest or any other way to do that.?

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))

And the html look like this

<form method="post" action="">
  {% csrf_token %}
  {{ formset.management_form }}
  <table>
    {% for form in formset %}
    {{ form }}
    {% endfor %}
  </table>
  <input type="submit"/>
</form>

Upvotes: 0

Views: 584

Answers (1)

bruno desthuilliers
bruno desthuilliers

Reputation: 77902

In your view you are binding formset to an ArticleForm, not to an ArticleFormSet. Also you are only creating one single Article from it, and you're not even using the form properly (ie: you're getting the title directly from request.POST instead of getting it from your form's cleaned_data). Your view code should look something like this (caveat: untested and possibly buggy code, but at least you'll get the picture).

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))

As a last point, I strongly suggest you have a look at ModelForms.

Upvotes: 1

Related Questions