Django Forms - How to Use Prefix Parameter

后端 未结 2 1468
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-24 07:30

Say I have a form like:

class GeneralForm(forms.Form):
    field1 = forms.IntegerField(required=False)
    field2 = forms. IntegerField(required=False)


        
相关标签:
2条回答
  • 2020-12-24 08:11

    Even better, I think formsets is exactly what you're looking for.

    class GeneralForm(forms.Form):
        field1 = forms.IntegerField(required=False)
        field2 = forms. IntegerField(required=False)
    
    from django.forms.formsets import formset_factory
    
    # GeneralSet is a formset with 2 occurrences of GeneralForm 
    # ( as a formset allows the user to add new items, this enforces
    #   2 fixed items, no less, no more )
    GeneralSet = formset_factory(GeneralForm, extra=2, max_num=2)
    
    # example view
    
    def someview(request):
        general_set = GeneralSet(request.POST)
        if general_set.is_valid():
            for form in general_set.forms:
                # do something with data
        return render_to_response("template.html", {'form': general_set}, RequestContext(request))
    

    You can even have a formset automatically generated from a model with modelformset_factory , which are used by the automated django admin. FormSet handle even more stuff than simple forms, like adding, removing and sorting items.

    0 讨论(0)
  • 2020-12-24 08:12

    You process each form as you normally would, ensuring that you create instances which have the same prefixes as those used to generate the form initially.

    Here's a slightly awkward example using the form you've given, as I don't know what the exact use case is:

    def some_view(request):
        if request.method == 'POST':
            form1 = GeneralForm(request.POST, prefix='form1')
            form2 = GeneralForm(request.POST, prefix='form2')
            if all([form1.is_valid(), form2.is_valid()]):
                pass # Do stuff with the forms
        else:
            form1 = GeneralForm(prefix='form1')
            form2 = GeneralForm(prefix='form2')
        return render_to_response('some_template.html', {
            'form1': form1,
            'form2': form2,
        })
    

    Here's some real-world sample code which demonstrates processing forms using the prefix:

    http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/

    0 讨论(0)
提交回复
热议问题