Reverted [7986].

It turns out that we need to treat filename creation/display (in
particular, the upload_to path) differently depending upon whether the value is
out of the database or provided by other code and there's no reliable way to
determine that at the moment (although some later proposed changes might alter
that). So calling get_FIELD_filename on an unsaved model with a changed file
attribute will not necessarily return the same result as after the save().

Refs #5619. Fixed #7843.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7998 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-07-19 22:26:32 +00:00
parent a4619944dc
commit 5141b67a19
2 changed files with 5 additions and 25 deletions

View File

@ -459,13 +459,13 @@ class Model(object):
def _get_FIELD_filename(self, field): def _get_FIELD_filename(self, field):
if getattr(self, field.attname): # Value is not blank. if getattr(self, field.attname): # Value is not blank.
return os.path.normpath(os.path.join(settings.MEDIA_ROOT, field.get_filename(getattr(self, field.attname)))) return os.path.normpath(os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname)))
return '' return ''
def _get_FIELD_url(self, field): def _get_FIELD_url(self, field):
if getattr(self, field.attname): # Value is not blank. if getattr(self, field.attname): # Value is not blank.
import urlparse import urlparse
return urlparse.urljoin(settings.MEDIA_URL, field.get_filename(getattr(self, field.attname))).replace('\\', '/') return urlparse.urljoin(settings.MEDIA_URL, getattr(self, field.attname)).replace('\\', '/')
return '' return ''
def _get_FIELD_size(self, field): def _get_FIELD_size(self, field):

View File

@ -12,8 +12,6 @@ import tempfile
from django.db import models from django.db import models
TEMP_DIR = tempfile.gettempdir()
ARTICLE_STATUS = ( ARTICLE_STATUS = (
(1, 'Draft'), (1, 'Draft'),
(2, 'Pending'), (2, 'Pending'),
@ -62,7 +60,7 @@ class PhoneNumber(models.Model):
class TextFile(models.Model): class TextFile(models.Model):
description = models.CharField(max_length=20) description = models.CharField(max_length=20)
file = models.FileField(upload_to=TEMP_DIR) file = models.FileField(upload_to=tempfile.gettempdir())
def __unicode__(self): def __unicode__(self):
return self.description return self.description
@ -73,9 +71,9 @@ class ImageFile(models.Model):
# If PIL is available, try testing PIL. # If PIL is available, try testing PIL.
# Otherwise, it's equivalent to TextFile above. # Otherwise, it's equivalent to TextFile above.
import Image import Image
image = models.ImageField(upload_to=TEMP_DIR) image = models.ImageField(upload_to=tempfile.gettempdir())
except ImportError: except ImportError:
image = models.FileField(upload_to=TEMP_DIR) image = models.FileField(upload_to=tempfile.gettempdir())
def __unicode__(self): def __unicode__(self):
return self.description return self.description
@ -786,24 +784,6 @@ u'Assistance'
# FileField ################################################################### # FileField ###################################################################
# File instance methods. Tests fix for #5619.
>>> instance = TextFile(description='nothing', file='name')
>>> expected = '%s/name' % TEMP_DIR
>>> instance.get_file_filename() == expected
True
>>> instance.get_file_url() == expected
True
>>> instance.save_file_file(instance.file, SimpleUploadedFile(instance.file, 'some text'))
>>> instance.get_file_filename() == expected
True
>>> instance.get_file_url() == expected
True
>>> os.unlink(instance.get_file_filename())
# File forms.
>>> class TextFileForm(ModelForm): >>> class TextFileForm(ModelForm):
... class Meta: ... class Meta:
... model = TextFile ... model = TextFile