Author: kmtracey
Date: 2009-05-19 18:13:33 -0500 (Tue, 19 May 2009)
New Revision: 10826

Modified:
   django/trunk/django/forms/models.py
   django/trunk/tests/regressiontests/model_forms_regress/models.py
   django/trunk/tests/regressiontests/model_forms_regress/tests.py
Log:
Fixed #11149 -- Don't call save_form_data on file-type fields multiple times 
when saving a model form.


Modified: django/trunk/django/forms/models.py
===================================================================
--- django/trunk/django/forms/models.py 2009-05-19 15:05:22 UTC (rev 10825)
+++ django/trunk/django/forms/models.py 2009-05-19 23:13:33 UTC (rev 10826)
@@ -50,14 +50,14 @@
             continue
         if exclude and f.name in exclude:
             continue
+        # OneToOneField doesn't allow assignment of None. Guard against that
+        # instead of allowing it and throwing an error.
+        if isinstance(f, models.OneToOneField) and cleaned_data[f.name] is 
None:
+            continue
         # Defer saving file-type fields until after the other fields, so a
         # callable upload_to can use the values from other fields.
         if isinstance(f, models.FileField):
             file_field_list.append(f)
-        # OneToOneField doesn't allow assignment of None. Guard against that
-        # instead of allowing it and throwing an error.
-        if isinstance(f, models.OneToOneField) and cleaned_data[f.name] is 
None:
-            pass
         else:
             f.save_form_data(instance, cleaned_data[f.name])
 

Modified: django/trunk/tests/regressiontests/model_forms_regress/models.py
===================================================================
--- django/trunk/tests/regressiontests/model_forms_regress/models.py    
2009-05-19 15:05:22 UTC (rev 10825)
+++ django/trunk/tests/regressiontests/model_forms_regress/models.py    
2009-05-19 23:13:33 UTC (rev 10826)
@@ -28,3 +28,12 @@
 
     def __unicode__(self):
         return self.headline
+
+class CustomFileField(models.FileField):
+    def save_form_data(self, instance, data):
+        been_here = getattr(self, 'been_saved', False)
+        assert not been_here, "save_form_data called more than once"
+        setattr(self, 'been_saved', True)
+
+class CustomFF(models.Model):
+    f = CustomFileField(upload_to='unused', blank=True)

Modified: django/trunk/tests/regressiontests/model_forms_regress/tests.py
===================================================================
--- django/trunk/tests/regressiontests/model_forms_regress/tests.py     
2009-05-19 15:05:22 UTC (rev 10825)
+++ django/trunk/tests/regressiontests/model_forms_regress/tests.py     
2009-05-19 23:13:33 UTC (rev 10826)
@@ -6,7 +6,7 @@
 from django.conf import settings
 from django.test import TestCase
 
-from models import Person, Triple, FilePathModel, Article, Publication
+from models import Person, Triple, FilePathModel, Article, Publication, 
CustomFF
 
 class ModelMultipleChoiceFieldTests(TestCase):
 
@@ -88,3 +88,16 @@
 <option value="2" selected="selected">Second Book</option>
 <option value="3">Third Book</option>
 </select>  Hold down "Control", or "Command" on a Mac, to select more than 
one.</li>""")
+
+class CFFForm(forms.ModelForm):
+    class Meta:
+        model = CustomFF
+
+class CustomFieldSaveTests(TestCase):
+    def test_save(self):
+        "Regression for #11149: save_form_data should be called only once"
+        
+        # It's enough that the form saves without error -- the custom save 
routine will
+        # generate an AssertionError if it is called more than once during 
save.
+        form = CFFForm(data = {'f': None})
+        form.save()
\ No newline at end of file


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to