Pregunta

I have a ModelForm that users can submit to save information to a database. I want to extend it with a ModelFormset so that the user can view and submit the multiple of the same model forms with different information at the same time. However, my POST data isn't binding to the ModelFormset, so the ModelFormset fails as invalid upon is_valid(). I see there is data associated with request.POST.copy(), it just

views.py

def create(request):
    if request.method == 'POST':
        post_data = request.POST.copy()
        print "POST DATA"
        print post_data
        for i in post_data:
            print i
        formSet = WorkOrder_Form(post_data)
        print "FORMSET"
        print formSet
        if formSet.is_valid():
            formSet.save()
        else:
            print 'INVALID'
        return HttpResponseRedirect('/Shelling/') 
    else:
        formSet = formset_factory(WorkOrder_Form, extra=1)
        return render_to_response('create.html',{'WorkOrder_Form':formSet}, context_instance=RequestContext(request))

template: (create.html)

{% load url from future %}
<a href="{% url 'index' %}"> Return to Index </a></li>
<br>
<br>
<form action="{% url 'create' %}" method="post"> {% csrf_token %}


{% for WorkOrder in WorkOrder_Form %}
    {{ WorkOrder.as_ul }}
    <br>
{% endfor %}

¿Fue útil?

Solución

You are using model forms, so you should use modelformset_factory instead of formset_factory. You can create the formset class outside of the create view. Then, you need to instantiate the formset in the GET and POST branches of your view.

Putting it together, you have the following (untested, so there might be some typos!)

WorkOrderFormSet = formset_factory(WorkOrder_Form, extra=1)

def create(request):
    if request.method == 'POST':
        post_data = request.POST.copy()
        formset = WorkOrderFormSet(data=post_data, queryset=WorkOrder.objects.none())
        if formset.is_valid():
            formset.save()
        else:
            print 'INVALID'
        return HttpResponseRedirect('/Shelling/') 
    else:
        formset = WorkOrderFormSet(queryset=WorkOrder.objects.none())
        return render_to_response('create.html',{'formset':formset}, context_instance=RequestContext(request))

And in the template:

{% for form in formset %}
    {{ form.as_ul }}
{% endfor %}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top