diff --git a/django/forms/formsets.py b/django/forms/formsets.py index 66ccd6d08da..bb8e3107e1f 100644 --- a/django/forms/formsets.py +++ b/django/forms/formsets.py @@ -170,18 +170,18 @@ class BaseFormSet(StrAndUnicode): # don't add data marked for deletion to self.ordered_data if self.can_delete and form.cleaned_data[DELETION_FIELD_NAME]: continue - # A sort function to order things numerically ascending, but - # None should be sorted below anything else. Allowing None as - # a comparison value makes it so we can leave ordering fields - # blamk. - def compare_ordering_values(x, y): - if x[1] is None: - return 1 - if y[1] is None: - return -1 - return x[1] - y[1] self._ordering.append((i, form.cleaned_data[ORDERING_FIELD_NAME])) # After we're done populating self._ordering, sort it. + # A sort function to order things numerically ascending, but + # None should be sorted below anything else. Allowing None as + # a comparison value makes it so we can leave ordering fields + # blamk. + def compare_ordering_values(x, y): + if x[1] is None: + return 1 + if y[1] is None: + return -1 + return x[1] - y[1] self._ordering.sort(compare_ordering_values) # Return a list of form.cleaned_data dicts in the order spcified by # the form data. diff --git a/tests/regressiontests/forms/formsets.py b/tests/regressiontests/forms/formsets.py index c3c89d078d6..dd2b188fd29 100644 --- a/tests/regressiontests/forms/formsets.py +++ b/tests/regressiontests/forms/formsets.py @@ -394,6 +394,18 @@ True {'votes': 500, 'ORDER': None, 'choice': u'The Decemberists'} {'votes': 50, 'ORDER': None, 'choice': u'Basia Bulat'} +Ordering should work with blank fieldsets. + +>>> data = { +... 'choices-TOTAL_FORMS': '3', # the number of forms rendered +... 'choices-INITIAL_FORMS': '0', # the number of forms with initial data +... } + +>>> formset = ChoiceFormSet(data, auto_id=False, prefix='choices') +>>> formset.is_valid() +True +>>> for form in formset.ordered_forms: +... print form.cleaned_data # FormSets with ordering + deletion ###########################################