From 2ba9df2f41cd649b42f5d7452aa2393aa6131f32 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 28 Apr 2009 14:17:18 +0000 Subject: [PATCH] Fixed #10082 -- Modified BaseFormSet so that ordering checks work when the formset is empty. Thanks to Petr Marhoun for the report and test case, and bmathieu for the fix. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10643 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/formsets.py | 20 ++++++++++---------- tests/regressiontests/forms/formsets.py | 12 ++++++++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/django/forms/formsets.py b/django/forms/formsets.py index 66ccd6d08d..bb8e3107e1 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 c3c89d078d..dd2b188fd2 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 ###########################################