BaseFormSet.can_order
Default: False
Lets you create a formset with the ability to order:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>> from django.forms import formset_factory >>> from myapp.forms import ArticleForm >>> ArticleFormSet = formset_factory(ArticleForm, can_order = True ) >>> formset = ArticleFormSet(initial = [ ... { 'title' : 'Article #1' , 'pub_date' : datetime.date( 2008 , 5 , 10 )}, ... { 'title' : 'Article #2' , 'pub_date' : datetime.date( 2008 , 5 , 11 )}, ... ]) >>> for form in formset: ... print (form.as_table()) <tr><th><label for = "id_form-0-title" >Title:< / label>< / th><td>< input type = "text" name = "form-0-title" value = "Article #1" id = "id_form-0-title" / >< / td>< / tr> <tr><th><label for = "id_form-0-pub_date" >Pub date:< / label>< / th><td>< input type = "text" name = "form-0-pub_date" value = "2008-05-10" id = "id_form-0-pub_date" / >< / td>< / tr> <tr><th><label for = "id_form-0-ORDER" >Order:< / label>< / th><td>< input type = "number" name = "form-0-ORDER" value = "1" id = "id_form-0-ORDER" / >< / td>< / tr> <tr><th><label for = "id_form-1-title" >Title:< / label>< / th><td>< input type = "text" name = "form-1-title" value = "Article #2" id = "id_form-1-title" / >< / td>< / tr> <tr><th><label for = "id_form-1-pub_date" >Pub date:< / label>< / th><td>< input type = "text" name = "form-1-pub_date" value = "2008-05-11" id = "id_form-1-pub_date" / >< / td>< / tr> <tr><th><label for = "id_form-1-ORDER" >Order:< / label>< / th><td>< input type = "number" name = "form-1-ORDER" value = "2" id = "id_form-1-ORDER" / >< / td>< / tr> <tr><th><label for = "id_form-2-title" >Title:< / label>< / th><td>< input type = "text" name = "form-2-title" id = "id_form-2-title" / >< / td>< / tr> <tr><th><label for = "id_form-2-pub_date" >Pub date:< / label>< / th><td>< input type = "text" name = "form-2-pub_date" id = "id_form-2-pub_date" / >< / td>< / tr> <tr><th><label for = "id_form-2-ORDER" >Order:< / label>< / th><td>< input type = "number" name = "form-2-ORDER" id = "id_form-2-ORDER" / >< / td>< / tr> |
This adds an additional field to each form. This new field is named ORDER
and is an forms.IntegerField
. For the forms that came from the initial data it automatically assigned them a numeric value. Let’s look at what will happen when the user changes these values:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | >>> data = { ... 'form-TOTAL_FORMS' : '3' , ... 'form-INITIAL_FORMS' : '2' , ... 'form-MAX_NUM_FORMS' : '', ... 'form-0-title' : 'Article #1' , ... 'form-0-pub_date' : '2008-05-10' , ... 'form-0-ORDER' : '2' , ... 'form-1-title' : 'Article #2' , ... 'form-1-pub_date' : '2008-05-11' , ... 'form-1-ORDER' : '1' , ... 'form-2-title' : 'Article #3' , ... 'form-2-pub_date' : '2008-05-01' , ... 'form-2-ORDER' : '0' , ... } >>> formset = ArticleFormSet(data, initial = [ ... { 'title' : 'Article #1' , 'pub_date' : datetime.date( 2008 , 5 , 10 )}, ... { 'title' : 'Article #2' , 'pub_date' : datetime.date( 2008 , 5 , 11 )}, ... ]) >>> formset.is_valid() True >>> for form in formset.ordered_forms: ... print (form.cleaned_data) { 'pub_date' : datetime.date( 2008 , 5 , 1 ), 'ORDER' : 0 , 'title' : 'Article #3' } { 'pub_date' : datetime.date( 2008 , 5 , 11 ), 'ORDER' : 1 , 'title' : 'Article #2' } { 'pub_date' : datetime.date( 2008 , 5 , 10 ), 'ORDER' : 2 , 'title' : 'Article #1' } |
Please login to continue.