Author: kmtracey
Date: 2008-11-04 13:48:35 -0600 (Tue, 04 Nov 2008)
New Revision: 9334
Modified:
django/trunk/AUTHORS
django/trunk/django/forms/models.py
django/trunk/tests/modeltests/model_forms/models.py
Log:
Fixed #9418 -- When saving a model form, defer saving of file-type fields until
after other fields, so that callable upload_to methods can use data from the
other fields. Thanks to Bernd Schlapsi for the report and initial patch.
Modified: django/trunk/AUTHORS
===================================================================
--- django/trunk/AUTHORS 2008-11-02 21:48:00 UTC (rev 9333)
+++ django/trunk/AUTHORS 2008-11-04 19:48:35 UTC (rev 9334)
@@ -344,6 +344,7 @@
Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
Vinay Sajip <[EMAIL PROTECTED]>
David Schein
+ Bernd Schlapsi
[EMAIL PROTECTED]
Ilya Semenov <[EMAIL PROTECTED]>
[EMAIL PROTECTED]
Modified: django/trunk/django/forms/models.py
===================================================================
--- django/trunk/django/forms/models.py 2008-11-02 21:48:00 UTC (rev 9333)
+++ django/trunk/django/forms/models.py 2008-11-04 19:48:35 UTC (rev 9334)
@@ -41,6 +41,7 @@
raise ValueError("The %s could not be %s because the data didn't"
" validate." % (opts.object_name, fail_message))
cleaned_data = form.cleaned_data
+ file_field_list = []
for f in opts.fields:
if not f.editable or isinstance(f, models.AutoField) \
or not f.name in cleaned_data:
@@ -49,7 +50,16 @@
continue
if exclude and f.name in exclude:
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)
+ else:
+ f.save_form_data(instance, cleaned_data[f.name])
+
+ for f in file_field_list:
f.save_form_data(instance, cleaned_data[f.name])
+
# Wrap up the saving of m2m data as a function.
def save_m2m():
opts = instance._meta
Modified: django/trunk/tests/modeltests/model_forms/models.py
===================================================================
--- django/trunk/tests/modeltests/model_forms/models.py 2008-11-02 21:48:00 UTC
(rev 9333)
+++ django/trunk/tests/modeltests/model_forms/models.py 2008-11-04 19:48:35 UTC
(rev 9334)
@@ -99,6 +99,10 @@
return self.description
class ImageFile(models.Model):
+ def custom_upload_path(self, filename):
+ path = self.path or 'tests'
+ return '%s/%s' % (path, filename)
+
description = models.CharField(max_length=20)
try:
# If PIL is available, try testing PIL.
@@ -106,9 +110,10 @@
# for PyPy, you need to check for the underlying modules
# If PIL is not available, this test is equivalent to TextFile above.
from PIL import Image, _imaging
- image = models.ImageField(storage=temp_storage, upload_to='tests')
+ image = models.ImageField(storage=temp_storage,
upload_to=custom_upload_path)
except ImportError:
- image = models.FileField(storage=temp_storage, upload_to='tests')
+ image = models.FileField(storage=temp_storage,
upload_to=custom_upload_path)
+ path = models.CharField(max_length=16, blank=True, default='')
def __unicode__(self):
return self.description
@@ -1122,6 +1127,15 @@
<...FieldFile: tests/test3.png>
>>> instance.delete()
+# Test callable upload_to behavior that's dependent on the value of another
field in the model
+>>> f = ImageFileForm(data={'description': u'And a final one', 'path': 'foo'},
files={'image': SimpleUploadedFile('test4.png', image_data)})
+>>> f.is_valid()
+True
+>>> instance = f.save()
+>>> instance.image
+<...FieldFile: foo/test4.png>
+>>> instance.delete()
+
# Media on a ModelForm ########################################################
# Similar to a regular Form class you can define custom media to be used on
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---