From bf10bded7aece13c95a1c3304c14bc9ba803a7b1 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 28 Apr 2009 14:22:39 +0000 Subject: [PATCH] [1.0.X] 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. Merge of r10643 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10644 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 a7e27713dc..cd857059d6 100644 --- a/django/forms/formsets.py +++ b/django/forms/formsets.py @@ -158,18 +158,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 ###########################################