Ticket #5361: filestorage.11.diff
File filestorage.11.diff, 62.5 KB (added by , 17 years ago) |
---|
-
django/core/filestorage/__init__.py
Property changes on: django\core\filestorage ___________________________________________________________________ Name: svn:ignore + *.pyc
1 -
django/core/filestorage/base.py
1 from StringIO import StringIO 2 3 from django.utils.text import get_valid_filename 4 5 class Backend(object): 6 def get_valid_filename(self, filename): 7 return get_valid_filename(filename) 8 9 def get_available_filename(self, filename): 10 # If the filename already exists, keep adding an underscore to the name 11 # of the file until the filename doesn't exist. 12 while self.file_exists(filename): 13 try: 14 dot_index = filename.rindex('.') 15 except ValueError: # filename has no dot 16 filename += '_' 17 else: 18 filename = filename[:dot_index] + '_' + filename[dot_index:] 19 return filename 20 21 class RemoteFile(StringIO): 22 """Sends files to a remote backend automatically, when necessary.""" 23 24 def __init__(self, data, mode, writer): 25 self._mode = mode 26 self._write_to_backend = writer 27 self._is_dirty = False 28 StringIO.__init__(self, data) 29 30 def write(self, data): 31 if 'w' not in self._mode: 32 raise AttributeError, "File was opened for read-only access." 33 StringIO.write(self, data) 34 self._is_dirty = True 35 36 def close(self): 37 if self._is_dirty: 38 self._write_to_backend(self.getvalue()) 39 StringIO.close(self) -
django/core/filestorage/filesystem.py
1 import os 2 import urlparse 3 4 from django.conf import settings 5 from django.utils.encoding import force_unicode, smart_str 6 from django.core.filestorage.base import Backend 7 from django.utils.text import force_unicode 8 9 class FileSystemBackend(Backend): 10 """Standard filesystem storage""" 11 12 def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL): 13 self.location = os.path.abspath(location) 14 self.base_url = base_url 15 16 def get_absolute_path(self, filename): 17 return os.path.normpath(os.path.join(self.location, filename)) 18 19 def get_filesize(self, filename): 20 return os.path.getsize(self.get_absolute_path(filename)) 21 22 def get_absolute_url(self, filename): 23 return urlparse.urljoin(self.base_url, filename).replace('\\', '/') 24 25 def open_file(self, filename, mode='rb'): 26 return open(self.get_absolute_path(filename), mode) 27 28 def file_exists(self, filename): 29 return os.path.exists(self.get_absolute_path(filename)) 30 31 def save_file(self, filename, raw_contents): 32 try: # Create the destination directory if it doesn't exist. 33 os.makedirs(os.path.join(self.location, os.path.dirname(filename))) 34 except OSError: # Directory probably already exists. 35 pass 36 filename = self.get_available_filename(filename) 37 38 # Write the file to disk. 39 fp = self.open_file(filename, 'wb') 40 fp.write(raw_contents) 41 fp.close() 42 43 # Store filenames with forward slashes, even on Windows 44 return force_unicode(filename.replace('\\', '/')) 45 46 def delete_file(self, filename): 47 file_name = self.get_absolute_path(filename) 48 # If the file exists, delete it from the filesystem. 49 if os.path.exists(file_name): 50 os.remove(file_name) -
django/core/serializers/base.py
61 61 if isinstance(field, models.DateTimeField): 62 62 value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S") 63 63 elif isinstance(field, models.FileField): 64 value = getattr(obj, "get_%s_url" % field.name, lambda: None)() 64 try: 65 value = getattr(obj, field.name).get_absolute_url() 66 except ValueError: 67 value = "" 65 68 else: 66 69 value = field.flatten_data(follow=None, obj=obj).get(field.name, "") 67 70 return smart_unicode(value) -
django/db/models/__init__.py
8 8 from django.db.models.base import Model, AdminOptions 9 9 from django.db.models.fields import * 10 10 from django.db.models.fields.subclassing import SubfieldBase 11 from django.db.models.fields.files import FileField, ImageField 11 12 from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED 12 13 from django.db.models import signals 13 14 from django.utils.functional import curry -
django/db/models/base.py
2 2 import django.db.models.manager 3 3 from django.core import validators 4 4 from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned 5 from django.db.models.fields import AutoField, ImageField,FieldDoesNotExist5 from django.db.models.fields import AutoField, FieldDoesNotExist 6 6 from django.db.models.fields.related import OneToOneRel, ManyToOneRel 7 7 from django.db.models.query import delete_objects 8 8 from django.db.models.options import Options, AdminOptions … … 18 18 import types 19 19 import sys 20 20 import os 21 from warnings import warn 21 22 22 23 class ModelBase(type): 23 24 "Metaclass for all models" … … 371 372 return getattr(self, cachename) 372 373 373 374 def _get_FIELD_filename(self, field): 374 if getattr(self, field.attname): # value is not blank 375 return os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname)) 376 return '' 375 warn("Use instance.%s.get_absolute_path()." % field.attname, DeprecationWarning) 376 try: 377 return getattr(self, field.attname).get_absolute_path() 378 except ValueError: 379 # For backward compatibility 380 return settings.MEDIA_ROOT 377 381 378 382 def _get_FIELD_url(self, field): 379 if getattr(self, field.attname): # value is not blank 380 import urlparse 381 return urlparse.urljoin(settings.MEDIA_URL, getattr(self, field.attname)).replace('\\', '/') 382 return '' 383 warn("Use instance.%s.get_absolute_url()." % field.attname, DeprecationWarning) 384 try: 385 return getattr(self, field.attname).get_absolute_url() 386 except ValueError: 387 # For backward compatibility 388 return settings.MEDIA_URL 383 389 384 390 def _get_FIELD_size(self, field): 385 return os.path.getsize(self._get_FIELD_filename(field)) 391 warn("Use instance.%s.get_filesize()." % field.attname, DeprecationWarning) 392 return getattr(self, field.attname).get_filesize() 386 393 387 394 def _save_FIELD_file(self, field, filename, raw_contents, save=True): 388 directory = field.get_directory_name() 389 try: # Create the date-based directory if it doesn't exist. 390 os.makedirs(os.path.join(settings.MEDIA_ROOT, directory)) 391 except OSError: # Directory probably already exists. 392 pass 393 filename = field.get_filename(filename) 395 warn("Use instance.%s.save_file()." % field.attname, DeprecationWarning) 396 return getattr(self, field.attname).save_file(filename, raw_contents, save) 394 397 395 # If the filename already exists, keep adding an underscore to the name of396 # the file until the filename doesn't exist.397 while os.path.exists(os.path.join(settings.MEDIA_ROOT, filename)):398 try:399 dot_index = filename.rindex('.')400 except ValueError: # filename has no dot401 filename += '_'402 else:403 filename = filename[:dot_index] + '_' + filename[dot_index:]404 405 # Write the file to disk.406 setattr(self, field.attname, filename)407 408 full_filename = self._get_FIELD_filename(field)409 fp = open(full_filename, 'wb')410 fp.write(raw_contents)411 fp.close()412 413 # Save the width and/or height, if applicable.414 if isinstance(field, ImageField) and (field.width_field or field.height_field):415 from django.utils.images import get_image_dimensions416 width, height = get_image_dimensions(full_filename)417 if field.width_field:418 setattr(self, field.width_field, width)419 if field.height_field:420 setattr(self, field.height_field, height)421 422 # Save the object because it has changed unless save is False423 if save:424 self.save()425 426 _save_FIELD_file.alters_data = True427 428 398 def _get_FIELD_width(self, field): 429 return self._get_image_dimensions(field)[0] 399 warn("Use instance.%s.get_width()." % field.attname, DeprecationWarning) 400 return getattr(self, field.attname).get_width() 430 401 431 402 def _get_FIELD_height(self, field): 432 return self._get_image_dimensions(field)[1] 403 warn("Use instance.%s.get_height()." % field.attname, DeprecationWarning) 404 return getattr(self, field.attname).get_height() 433 405 434 def _get_image_dimensions(self, field):435 cachename = "__%s_dimensions_cache" % field.name436 if not hasattr(self, cachename):437 from django.utils.images import get_image_dimensions438 filename = self._get_FIELD_filename(field)439 setattr(self, cachename, get_image_dimensions(filename))440 return getattr(self, cachename)441 442 406 ############################################ 443 407 # HELPER FUNCTIONS (CURRIED MODEL METHODS) # 444 408 ############################################ -
django/db/models/fields/__init__.py
1 1 import datetime 2 import os3 2 import time 4 3 try: 5 4 import decimal … … 276 275 name_prefix is a prefix to prepend to the "field_name" argument. 277 276 rel is a boolean specifying whether this field is in a related context. 278 277 """ 278 from django.db.models.fields import files 279 279 280 field_objs, params = self.prepare_field_objs_and_params(manipulator, name_prefix) 280 281 281 282 # Add the "unique" validator(s). … … 307 308 # If this field is in a related context, check whether any other fields 308 309 # in the related object have core=True. If so, add a validator -- 309 310 # RequiredIfOtherFieldsGiven -- to this FormField. 310 if rel and not self.blank and not isinstance(self, AutoField) and not isinstance(self, FileField):311 if rel and not self.blank and not isinstance(self, AutoField) and not isinstance(self, files.FileField): 311 312 # First, get the core fields, if any. 312 313 core_field_names = [] 313 314 for f in opts.fields: … … 719 720 defaults.update(kwargs) 720 721 return super(EmailField, self).formfield(**defaults) 721 722 722 class FileField(Field):723 def __init__(self, verbose_name=None, name=None, upload_to='', **kwargs):724 self.upload_to = upload_to725 kwargs['max_length'] = kwargs.get('max_length', 100)726 Field.__init__(self, verbose_name, name, **kwargs)727 728 def get_internal_type(self):729 return "FileField"730 731 def get_db_prep_save(self, value):732 "Returns field's value prepared for saving into a database."733 # Need to convert UploadedFile objects provided via a form to unicode for database insertion734 if value is None:735 return None736 return unicode(value)737 738 def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):739 field_list = Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow)740 if not self.blank:741 if rel:742 # This validator makes sure FileFields work in a related context.743 class RequiredFileField(object):744 def __init__(self, other_field_names, other_file_field_name):745 self.other_field_names = other_field_names746 self.other_file_field_name = other_file_field_name747 self.always_test = True748 def __call__(self, field_data, all_data):749 if not all_data.get(self.other_file_field_name, False):750 c = validators.RequiredIfOtherFieldsGiven(self.other_field_names, ugettext_lazy("This field is required."))751 c(field_data, all_data)752 # First, get the core fields, if any.753 core_field_names = []754 for f in opts.fields:755 if f.core and f != self:756 core_field_names.extend(f.get_manipulator_field_names(name_prefix))757 # Now, if there are any, add the validator to this FormField.758 if core_field_names:759 field_list[0].validator_list.append(RequiredFileField(core_field_names, field_list[1].field_name))760 else:761 v = validators.RequiredIfOtherFieldNotGiven(field_list[1].field_name, ugettext_lazy("This field is required."))762 v.always_test = True763 field_list[0].validator_list.append(v)764 field_list[0].is_required = field_list[1].is_required = False765 766 # If the raw path is passed in, validate it's under the MEDIA_ROOT.767 def isWithinMediaRoot(field_data, all_data):768 f = os.path.abspath(os.path.join(settings.MEDIA_ROOT, field_data))769 if not f.startswith(os.path.abspath(os.path.normpath(settings.MEDIA_ROOT))):770 raise validators.ValidationError, _("Enter a valid filename.")771 field_list[1].validator_list.append(isWithinMediaRoot)772 return field_list773 774 def contribute_to_class(self, cls, name):775 super(FileField, self).contribute_to_class(cls, name)776 setattr(cls, 'get_%s_filename' % self.name, curry(cls._get_FIELD_filename, field=self))777 setattr(cls, 'get_%s_url' % self.name, curry(cls._get_FIELD_url, field=self))778 setattr(cls, 'get_%s_size' % self.name, curry(cls._get_FIELD_size, field=self))779 setattr(cls, 'save_%s_file' % self.name, lambda instance, filename, raw_contents, save=True: instance._save_FIELD_file(self, filename, raw_contents, save))780 dispatcher.connect(self.delete_file, signal=signals.post_delete, sender=cls)781 782 def delete_file(self, instance):783 if getattr(instance, self.attname):784 file_name = getattr(instance, 'get_%s_filename' % self.name)()785 # If the file exists and no other object of this type references it,786 # delete it from the filesystem.787 if os.path.exists(file_name) and \788 not instance.__class__._default_manager.filter(**{'%s__exact' % self.name: getattr(instance, self.attname)}):789 os.remove(file_name)790 791 def get_manipulator_field_objs(self):792 return [oldforms.FileUploadField, oldforms.HiddenField]793 794 def get_manipulator_field_names(self, name_prefix):795 return [name_prefix + self.name + '_file', name_prefix + self.name]796 797 def save_file(self, new_data, new_object, original_object, change, rel, save=True):798 upload_field_name = self.get_manipulator_field_names('')[0]799 if new_data.get(upload_field_name, False):800 func = getattr(new_object, 'save_%s_file' % self.name)801 if rel:802 func(new_data[upload_field_name][0]["filename"], new_data[upload_field_name][0]["content"], save)803 else:804 func(new_data[upload_field_name]["filename"], new_data[upload_field_name]["content"], save)805 806 def get_directory_name(self):807 return os.path.normpath(force_unicode(datetime.datetime.now().strftime(smart_str(self.upload_to))))808 809 def get_filename(self, filename):810 from django.utils.text import get_valid_filename811 f = os.path.join(self.get_directory_name(), get_valid_filename(os.path.basename(filename)))812 return os.path.normpath(f)813 814 def save_form_data(self, instance, data):815 from django.newforms.fields import UploadedFile816 if data and isinstance(data, UploadedFile):817 getattr(instance, "save_%s_file" % self.name)(data.filename, data.content, save=False)818 819 def formfield(self, **kwargs):820 defaults = {'form_class': forms.FileField}821 # If a file has been provided previously, then the form doesn't require822 # that a new file is provided this time.823 # The code to mark the form field as not required is used by824 # form_for_instance, but can probably be removed once form_for_instance825 # is gone. ModelForm uses a different method to check for an existing file.826 if 'initial' in kwargs:827 defaults['required'] = False828 defaults.update(kwargs)829 return super(FileField, self).formfield(**defaults)830 831 723 class FilePathField(Field): 832 724 def __init__(self, verbose_name=None, name=None, path='', match=None, recursive=False, **kwargs): 833 725 self.path, self.match, self.recursive = path, match, recursive … … 854 746 defaults.update(kwargs) 855 747 return super(FloatField, self).formfield(**defaults) 856 748 857 class ImageField(FileField):858 def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs):859 self.width_field, self.height_field = width_field, height_field860 FileField.__init__(self, verbose_name, name, **kwargs)861 862 def get_manipulator_field_objs(self):863 return [oldforms.ImageUploadField, oldforms.HiddenField]864 865 def contribute_to_class(self, cls, name):866 super(ImageField, self).contribute_to_class(cls, name)867 # Add get_BLAH_width and get_BLAH_height methods, but only if the868 # image field doesn't have width and height cache fields.869 if not self.width_field:870 setattr(cls, 'get_%s_width' % self.name, curry(cls._get_FIELD_width, field=self))871 if not self.height_field:872 setattr(cls, 'get_%s_height' % self.name, curry(cls._get_FIELD_height, field=self))873 874 def get_internal_type(self):875 return "ImageField"876 877 def save_file(self, new_data, new_object, original_object, change, rel, save=True):878 FileField.save_file(self, new_data, new_object, original_object, change, rel, save)879 # If the image has height and/or width field(s) and they haven't880 # changed, set the width and/or height field(s) back to their original881 # values.882 if change and (self.width_field or self.height_field) and save:883 if self.width_field:884 setattr(new_object, self.width_field, getattr(original_object, self.width_field))885 if self.height_field:886 setattr(new_object, self.height_field, getattr(original_object, self.height_field))887 new_object.save()888 889 def formfield(self, **kwargs):890 defaults = {'form_class': forms.ImageField}891 defaults.update(kwargs)892 return super(ImageField, self).formfield(**defaults)893 894 749 class IntegerField(Field): 895 750 empty_strings_allowed = False 896 751 def get_manipulator_field_objs(self): -
django/db/models/fields/files.py
1 import datetime 2 import os 3 4 from django.conf import settings 5 from django.db.models.fields import Field 6 from django.core.filestorage.filesystem import FileSystemBackend 7 from django.utils.functional import curry 8 from django.dispatch import dispatcher 9 from django.db.models import signals 10 from django.utils.encoding import force_unicode, smart_str 11 from django.utils.translation import ugettext_lazy, ugettext as _ 12 from django import oldforms 13 from django import newforms as forms 14 from django.core import validators 15 16 class File(object): 17 def __init__(self, instance, field, filename): 18 self.instance = instance 19 self.field = field 20 self.backend = field.backend 21 self.filename = filename or u'' 22 23 def __unicode__(self): 24 return self.filename or u'' 25 26 def __repr__(self): 27 return smart_str(u'<%s: %s>' % (self.__class__.__name__, unicode(self))) 28 29 def __nonzero__(self): 30 return not not self.filename 31 32 def __eq__(self, other): 33 if not self.filename and not other: 34 # An empty filename should equate to None 35 return True 36 return self.filename == other 37 38 def get_absolute_path(self): 39 if not self: 40 raise ValueError, "The '%s' attribute has no file associated with it." % self.field.name 41 return self.backend.get_absolute_path(self.filename) 42 43 def get_absolute_url(self): 44 if not self: 45 raise ValueError, "The '%s' attribute has no file associated with it." % self.field.name 46 return self.backend.get_absolute_url(self.filename) 47 48 def get_filesize(self): 49 if not self: 50 raise ValueError, "The '%s' attribute has no file associated with it." % self.field.name 51 if not hasattr(self, '_filesize'): 52 self._filesize = self.backend.get_filesize(self.filename) 53 return self._filesize 54 55 def open_file(self, mode='rb'): 56 if not self: 57 raise ValueError, "The '%s' attribute has no file associated with it." % self.field.name 58 return self.backend.open_file(self.filename, mode) 59 60 def save_file(self, filename, raw_contents, save=True): 61 filename = self.field.generate_filename(self.instance, filename) 62 self.filename = self.backend.save_file(filename, raw_contents) 63 self._has_file = True 64 65 # Update the filesize cache 66 self._filesize = len(raw_contents) 67 68 # Save the object because it has changed, unless save is False 69 if save: 70 self.instance.save() 71 72 def delete_file(self, save=True): 73 if not self: 74 raise ValueError, "The '%s' attribute has no file associated with it." % self.field.name 75 self.backend.delete_file(self.filename) 76 77 self.filename = None 78 79 # Delete the filesize cache 80 if hasattr(self, '_filesize'): 81 del self._filesize 82 83 if save: 84 self.instance.save() 85 86 class FileProxy(object): 87 def __init__(self, field): 88 self.field = field 89 90 def __get__(self, instance=None, owner=None): 91 if instance is None: 92 raise AttributeError, "%s can only be accessed from %s instances." % (self.field.name, self.owner.__name__) 93 return instance.__dict__[self.field.name] 94 95 def __set__(self, instance, value): 96 attr = self.field.attr_class(instance, self.field, value) 97 instance.__dict__[self.field.name] = attr 98 99 class FileField(Field): 100 attr_class = File 101 102 def __init__(self, verbose_name=None, name=None, upload_to='', backend=None, **kwargs): 103 for arg in ('core', 'primary_key', 'unique'): 104 if arg in kwargs: 105 raise TypeError, "__init__() got an unexpected keyword argument '%s'" % arg 106 self.backend = backend or FileSystemBackend() 107 108 self.upload_to = upload_to 109 if callable(upload_to): 110 self.generate_filename = upload_to 111 112 kwargs['max_length'] = kwargs.get('max_length', 100) 113 super(FileField, self).__init__(verbose_name, name, **kwargs) 114 115 def get_internal_type(self): 116 return "FileField" 117 118 def get_db_prep_lookup(self, lookup_type, value): 119 if hasattr(value, 'filename'): 120 value = value.filename 121 return super(FileField, self).get_db_prep_lookup(lookup_type, value) 122 123 def get_db_prep_save(self, value): 124 "Returns field's value prepared for saving into a database." 125 # Need to convert UploadedFile objects provided via a form to unicode for database insertion 126 if value is None: 127 return None 128 return unicode(value.filename) 129 130 def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True): 131 field_list = Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow) 132 if not self.blank: 133 if rel: 134 # This validator makes sure FileFields work in a related context. 135 class RequiredFileField(object): 136 def __init__(self, other_field_names, other_file_field_name): 137 self.other_field_names = other_field_names 138 self.other_file_field_name = other_file_field_name 139 self.always_test = True 140 def __call__(self, field_data, all_data): 141 if not all_data.get(self.other_file_field_name, False): 142 c = validators.RequiredIfOtherFieldsGiven(self.other_field_names, ugettext_lazy("This field is required.")) 143 c(field_data, all_data) 144 # First, get the core fields, if any. 145 core_field_names = [] 146 for f in opts.fields: 147 if f.core and f != self: 148 core_field_names.extend(f.get_manipulator_field_names(name_prefix)) 149 # Now, if there are any, add the validator to this FormField. 150 if core_field_names: 151 field_list[0].validator_list.append(RequiredFileField(core_field_names, field_list[1].field_name)) 152 else: 153 v = validators.RequiredIfOtherFieldNotGiven(field_list[1].field_name, ugettext_lazy("This field is required.")) 154 v.always_test = True 155 field_list[0].validator_list.append(v) 156 field_list[0].is_required = field_list[1].is_required = False 157 158 # If the raw path is passed in, validate it's under the MEDIA_ROOT. 159 def isWithinMediaRoot(field_data, all_data): 160 f = os.path.abspath(os.path.join(settings.MEDIA_ROOT, field_data)) 161 if not f.startswith(os.path.abspath(os.path.normpath(settings.MEDIA_ROOT))): 162 raise validators.ValidationError, _("Enter a valid filename.") 163 field_list[1].validator_list.append(isWithinMediaRoot) 164 return field_list 165 166 def contribute_to_class(self, cls, name): 167 super(FileField, self).contribute_to_class(cls, name) 168 setattr(cls, self.name, FileProxy(self)) 169 setattr(cls, 'get_%s_filename' % self.name, curry(cls._get_FIELD_filename, field=self)) 170 setattr(cls, 'get_%s_url' % self.name, curry(cls._get_FIELD_url, field=self)) 171 setattr(cls, 'get_%s_size' % self.name, curry(cls._get_FIELD_size, field=self)) 172 setattr(cls, 'save_%s_file' % self.name, lambda instance, filename, raw_contents, save=True: instance._save_FIELD_file(self, filename, raw_contents, save)) 173 dispatcher.connect(self.delete_file, signal=signals.post_delete, sender=cls) 174 175 def delete_file(self, instance, sender): 176 filename = getattr(instance, self.attname).filename 177 # If no other object of this type references the file, 178 # delete it from the backend. 179 if not sender._default_manager.filter(**{self.name: filename}): 180 self.backend.delete_file(filename) 181 182 def get_manipulator_field_objs(self): 183 return [oldforms.FileUploadField, oldforms.HiddenField] 184 185 def get_manipulator_field_names(self, name_prefix): 186 return [name_prefix + self.name + '_file', name_prefix + self.name] 187 188 def save_file(self, new_data, new_object, original_object, change, rel, save=True): 189 upload_field_name = self.get_manipulator_field_names('')[0] 190 if new_data.get(upload_field_name, False): 191 if rel: 192 field = new_data[upload_field_name][0] 193 else: 194 field = new_data[upload_field_name] 195 filename = self.get_filename(field["filename"]) 196 getattr(new_object, self.attname).save_file(filename, field["content"], save) 197 198 def get_directory_name(self): 199 return os.path.normpath(force_unicode(datetime.datetime.now().strftime(smart_str(self.upload_to)))) 200 201 def get_filename(self, filename): 202 return os.path.normpath(self.backend.get_valid_filename(os.path.basename(filename))) 203 204 def generate_filename(self, instance, filename): 205 return os.path.join(self.get_directory_name(), self.get_filename(filename)) 206 207 def save_form_data(self, instance, data): 208 from django.newforms.fields import UploadedFile 209 if data and isinstance(data, UploadedFile): 210 getattr(instance, self.attname).save_file(data.filename, data.content, save=False) 211 212 def formfield(self, **kwargs): 213 defaults = {'form_class': forms.FileField} 214 # If a file has been provided previously, then the form doesn't require 215 # that a new file is provided this time. 216 # The code to mark the form field as not required is used by 217 # form_for_instance, but can probably be removed once form_for_instance 218 # is gone. ModelForm uses a different method to check for an existing file. 219 if 'initial' in kwargs: 220 defaults['required'] = False 221 defaults.update(kwargs) 222 return super(FileField, self).formfield(**defaults) 223 224 class ImageFile(File): 225 def get_width(self): 226 return self._get_image_dimensions()[0] 227 228 def get_height(self): 229 return self._get_image_dimensions()[1] 230 231 def _get_image_dimensions(self): 232 if not hasattr(self, '_dimensions_cache'): 233 from django.utils.images import get_image_dimensions 234 self._dimensions_cache = get_image_dimensions(self.open_file()) 235 return self._dimensions_cache 236 237 def save_file(self, filename, raw_contents, save=True): 238 super(ImageFile, self).save_file(filename, raw_contents, save) 239 240 # Update the cache for image dimensions 241 from django.utils.images import get_image_dimensions 242 from cStringIO import StringIO 243 self._dimensions_cache = get_image_dimensions(StringIO(raw_contents)) 244 245 def delete_file(self, save=True): 246 # Clear the image dimensions cache 247 del self._dimensions_cache 248 249 super(ImageFile, self).delete_file(save) 250 251 class ImageField(FileField): 252 attr_class = ImageFile 253 254 def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs): 255 self.width_field, self.height_field = width_field, height_field 256 FileField.__init__(self, verbose_name, name, **kwargs) 257 258 def get_manipulator_field_objs(self): 259 return [oldforms.ImageUploadField, oldforms.HiddenField] 260 261 def contribute_to_class(self, cls, name): 262 super(ImageField, self).contribute_to_class(cls, name) 263 # Add get_BLAH_width and get_BLAH_height methods, but only if the 264 # image field doesn't have width and height cache fields. 265 if not self.width_field: 266 setattr(cls, 'get_%s_width' % self.name, curry(cls._get_FIELD_width, field=self)) 267 if not self.height_field: 268 setattr(cls, 'get_%s_height' % self.name, curry(cls._get_FIELD_height, field=self)) 269 270 def get_internal_type(self): 271 return "ImageField" 272 273 def save_file(self, new_data, new_object, original_object, change, rel, save=True): 274 # If the image has height and/or width field(s) and they haven't 275 # changed, set the width and/or height field(s) back to their original 276 # values. 277 if self.width_field or self.height_field: 278 if original_object and not change: 279 if self.width_field: 280 setattr(new_object, self.width_field, getattr(original_object, self.width_field)) 281 if self.height_field: 282 setattr(new_object, self.height_field, getattr(original_object, self.height_field)) 283 else: 284 from cStringIO import StringIO 285 from django.utils.images import get_image_dimensions 286 287 upload_field_name = self.get_manipulator_field_names('')[0] 288 if rel: 289 field = new_data[upload_field_name][0] 290 else: 291 field = new_data[upload_field_name] 292 293 # Get the width and height from the raw content to avoid extra 294 # unnecessary trips to the file backend. 295 width, height = get_image_dimensions(StringIO(field["content"])) 296 297 if self.width_field: 298 setattr(new_object, self.width_field, width) 299 if self.height_field: 300 setattr(new_object, self.height_field, height) 301 FileField.save_file(self, new_data, new_object, original_object, change, rel, save) 302 303 def formfield(self, **kwargs): 304 defaults = {'form_class': forms.ImageField} 305 defaults.update(kwargs) 306 return super(ImageField, self).formfield(**defaults) -
django/db/models/manipulators.py
1 1 from django.core.exceptions import ObjectDoesNotExist 2 2 from django import oldforms 3 3 from django.core import validators 4 from django.db.models.fields import FileField, AutoField 4 from django.db.models.fields import AutoField 5 from django.db.models.fields.files import FileField 5 6 from django.dispatch import dispatcher 6 7 from django.db.models import signals 7 8 from django.utils.functional import curry -
django/utils/images.py
6 6 7 7 import ImageFile 8 8 9 def get_image_dimensions( path):10 """Returns the (width, height) of an image at a givenpath."""9 def get_image_dimensions(file_or_path): 10 """Returns the (width, height) of an image, given an open file or a path.""" 11 11 p = ImageFile.Parser() 12 fp = open(path, 'rb') 12 if hasattr(file_or_path, 'read'): 13 fp = file_or_path 14 else: 15 fp = open(file_or_path, 'rb') 13 16 while 1: 14 17 data = fp.read(1024) 15 18 if not data: -
docs/db-api.txt
1870 1870 get_FOO_filename() 1871 1871 ------------------ 1872 1872 1873 **Deprecated in Django development version. See `managing files`_ for the new, 1874 preferred method for dealing with files.** 1875 1873 1876 For every ``FileField``, the object will have a ``get_FOO_filename()`` method, 1874 1877 where ``FOO`` is the name of the field. This returns the full filesystem path 1875 1878 to the file, according to your ``MEDIA_ROOT`` setting. … … 1880 1883 get_FOO_url() 1881 1884 ------------- 1882 1885 1886 **Deprecated in Django development version. See `managing files`_ for the new, 1887 preferred method for dealing with files.** 1888 1883 1889 For every ``FileField``, the object will have a ``get_FOO_url()`` method, 1884 1890 where ``FOO`` is the name of the field. This returns the full URL to the file, 1885 1891 according to your ``MEDIA_URL`` setting. If the value is blank, this method … … 1888 1894 get_FOO_size() 1889 1895 -------------- 1890 1896 1897 **Deprecated in Django development version. See `managing files`_ for the new, 1898 preferred method for dealing with files.** 1899 1891 1900 For every ``FileField``, the object will have a ``get_FOO_size()`` method, 1892 1901 where ``FOO`` is the name of the field. This returns the size of the file, in 1893 1902 bytes. (Behind the scenes, it uses ``os.path.getsize``.) … … 1895 1904 save_FOO_file(filename, raw_contents) 1896 1905 ------------------------------------- 1897 1906 1907 **Deprecated in Django development version. See `managing files`_ for the new, 1908 preferred method for dealing with files.** 1909 1898 1910 For every ``FileField``, the object will have a ``save_FOO_file()`` method, 1899 1911 where ``FOO`` is the name of the field. This saves the given file to the 1900 1912 filesystem, using the given filename. If a file with the given filename already … … 1904 1916 get_FOO_height() and get_FOO_width() 1905 1917 ------------------------------------ 1906 1918 1919 **Deprecated in Django development version. See `managing files`_ for the new, 1920 preferred method for dealing with files.** 1921 1907 1922 For every ``ImageField``, the object will have ``get_FOO_height()`` and 1908 1923 ``get_FOO_width()`` methods, where ``FOO`` is the name of the field. This 1909 1924 returns the height (or width) of the image, as an integer, in pixels. 1910 1925 1926 .. _`managing files`: ../files/ 1927 1911 1928 Shortcuts 1912 1929 ========= 1913 1930 -
docs/files.txt
1 ============== 2 Managing files 3 ============== 4 5 When dealing with files, Django provides a number of features to make this task 6 easier and more portable. A backend protocol is available to allow files to be 7 stored in a variety of locations, and a special object is provided to allow 8 models to make use of this protocol, without having to worry about which storage 9 system is being used. 10 11 Using files in models 12 ===================== 13 14 When accessing a ``FileField`` attached to a model, a special object provides 15 access to the file and information about it. 16 17 get_absolute_path() 18 ------------------- 19 20 Returns the absolute path to the file's location on a local filesystem. For 21 backends which do not store files locally, this will return `None`. 22 23 get_absolute_url() 24 ------------------ 25 26 Provides a URL where the content of the file can be retrieved. Therefore, 27 returned from this method is suitable for use as the destination of a link to 28 the file. 29 30 get_filesize() 31 -------------- 32 33 Returns the size of the file, as an integer. 34 35 open_file(mode='rb') 36 -------------------- 37 38 Returns an open file object, providing read or write access to the file's 39 contents. The ``mode`` argument allows the same values as Python's standard 40 ``open()`` function. 41 42 save_file(filename, raw_contents, save=True) 43 -------------------------------------------- 44 45 Saves a new file with the filename and contents provided. This will not replace 46 the existing file, but will create a new file and update the object to point to 47 it. The optional ``save`` argument dictates whether the model instance will be 48 saved to the database immediately. 49 50 get_width() and get_height() 51 ---------------------------- 52 53 When using an ``ImageField``, these two methods will be available, providing 54 easy access to the dimensions of the image. 55 56 Example 57 ------- 58 59 Consider the following model, using an ``ImageField`` to store a product photo:: 60 61 class Product(models.Model): 62 name = models.CharField(maxlength=255) 63 price = models.DecimalField(max_digits=5, decimal_places=2) 64 photo = models.ImageField(upload_to='product_photos') 65 66 Your views can then use the ``photo`` attribute with the functions described 67 above, as follows:: 68 69 >>> car = Product.object.get(name="'57 Chevy") 70 >>> car.photo.get_absolute_url() 71 '/products/photo/123.jpg' 72 >>> car.photo.get_width(), car.photo.get_height() 73 (800, 600) 74 75 Using a storage backend with FileField 76 ====================================== 77 78 When using a storage backend, supply whatever options are appropriate for 79 that backend when creating a new object. Details on the requirements for the 80 included backends can be found below. Then pass that object as the ``backend`` 81 argument to a ``FileField``. 82 83 If using the ``FileSystemBackend``, it is not necessary to create a backend 84 object explicitly. Simply supplying the ``upload_to`` argument will create the 85 backend object automatically. 86 87 See the ```FileField`` documentation`_ for more information on using the field. 88 89 .. _FileField documentation: ../model-api/#filefield 90 91 For example, the following code will explicitly use the ``FileSystemBackend``:: 92 93 from django.db import models 94 from django.core.filestorage.filesystem import FileSystemBackend 95 96 fs = FileSystemBackend(location='product_photos') 97 98 class Product(models.Model): 99 name = models.CharField(maxlength=255) 100 price = models.DecimalField(max_digits=5, decimal_places=2) 101 photo = models.ImageField(backend=fs) 102 103 Using a storage backend on its own 104 ================================== 105 106 Storage backends may also be used directly, without being attached to a model. 107 Simply use the following API on any instantiated backend to access files without 108 having to worry about the underlying storage mechanism. 109 110 file_exists(filename) 111 --------------------- 112 113 Returns ``True`` or ``False, indicating whether there is already a file present 114 at the location referenced by``filename``. 115 116 open_file(filename, mode='rb') 117 ------------------------------ 118 119 Returns an open file, or file-like, object to provide access to the contents of 120 the file referenced by ``filename``. The ``mode`` argument allows the same 121 values as Python's standard ``open()`` function. 122 123 get_filesize(filename) 124 ---------------------- 125 126 Returns the total size of the file referenced by ``filename``, as an integer. 127 128 get_absolute_url(filename) 129 -------------------------- 130 131 Returns the URL where the contents of the file referenced by ``filename`` can 132 be accessed. 133 134 save_file(filename, raw_contents) 135 --------------------------------- 136 137 Saves a new file using the backend-specific storage mechanism, preferably using 138 the name specified. If there already exists a file at the location referenced by 139 ``filename``, this may modify the filename as necessary to locate one that is 140 available. Once the file is saved, this method will return the filename where 141 the file was actually stored. 142 143 delete_file(filename) 144 --------------------- 145 146 Deletes the file referenced by ``filename``. If the file does not already exist, 147 this method will simply return without raising an exception. 148 149 Available backends 150 ================== 151 152 Only one storage backend is supplied in the official Django distribution, but 153 more may be available elsewhere. If you'd like to use a different backend than 154 the one listed below, see the documentation included with the backend. 155 156 django.core.filestorage.filesystem.FileSystemBackend 157 ---------------------------------------------------- 158 159 This backend stores files on the system's standard filesystem. 160 161 ====================== =================================================== 162 Argument Description 163 ====================== =================================================== 164 ``location`` Required. A local filesystem path that will be 165 appended to the ``MEDIA_ROOT`` setting to determine 166 the output of the ``get_<fieldname>_url()`` helper 167 function. 168 ``media_root`` Required. Absolute path to the directory that holds 169 the files for this backend. If omitted, it will be 170 set to the value of your ``MEDIA_ROOT`` setting. 171 ``media_url`` Optional. URL that serves the files stored in this 172 backend. If omitted, it will default to the value 173 of your ``MEDIA_URL`` setting. 174 ====================== =================================================== 175 176 Writing a storage backend 177 ========================= 178 179 While the default filesystem storage is suitable for most needs, there are many 180 other storage mechanisms that may be used, and situations that will require 181 special processing. In order to use Django in these environments, it's fairly 182 simple to write a new storage backend, creating a wrapper around whatever 183 libraries are used to access your files, or simply customizing method calls on 184 an existing backend. 185 186 A backend must implement the methods described above, but the built-in backends 187 also define two other methods to assist in the process. When writing a custom 188 backend from scratch, these methods are available on the provided ``Backend`` 189 class, living at ``django.core.filestorage.base``, so subclassing it will allow 190 these methods to be available on the custom backend as well. When extending an 191 existing backend, overriding these methods allow a great deal of customization. 192 193 get_valid_filename(filename) 194 ---------------------------- 195 196 Returns a filename suitable for use with the underlying storage system. The 197 ``filename`` argument passed to this method is the original filename sent to the 198 server, after having any path information removed. Override this to customize 199 how non-standard characters are converted to safe filenames. 200 201 The code provided on ``Backend`` retains only alpha-numeric characters, periods 202 and underscores from the original filename, removing everything else. 203 204 get_available_filename(filename) 205 -------------------------------- 206 207 Returns a filename that is available in the storage mechanism, possibly taking 208 the provided filename into account. The ``filename`` argument passed to this 209 method will have already cleaned to a filename valid for the storage system, 210 according to the ``get_valid_filename()`` method described above. 211 212 The code provided on ``Backend`` simply appends underscores to the filename 213 until it finds one that's available in the destination directory. 214 215 Opening remote files 216 -------------------- 217 218 When accessing a file stored at a remote location, the object returned by 219 ``open_file()`` should function like a standard `file object`_, but to keep 220 network traffic to a minimum, writes to the remote storage system should only 221 occur if actually necessary. To make this task easier, Django provides a class 222 to automate this process. 223 224 Living at ``django.core.filestorage.base``, the ``RemoteFile`` class simulates 225 a standard Python `file object`_, but can write changes to a remote storage 226 system when application using a function provided by the storage backend. 227 Creating an instance of this object requires three arguments, which are 228 described below. 229 230 ====================== =================================================== 231 Argument Description 232 ====================== =================================================== 233 ``data`` The raw content of the file. 234 ``mode`` The access mode that was passed to the 235 ``open_file()`` method. 236 ``writer`` A function that will be used to write the contents 237 to the backend-specific storage mechanism. The 238 function provided here will need to take a single 239 argument, which will be the raw content to be 240 written to the file. 241 ====================== =================================================== 242 243 .. _file object: http://docs.python.org/lib/bltin-file-objects.html 244 -
docs/model-api.txt
230 230 ``FileField`` 231 231 ~~~~~~~~~~~~~ 232 232 233 A file-upload field. Has one **required** argument: 233 A file-upload field. Has three special arguments, of which the first is 234 **required**: 234 235 235 236 ====================== =================================================== 236 237 Argument Description 237 238 ====================== =================================================== 238 ``upload_to`` A local filesystem path that will be appended to 239 your ``MEDIA_ROOT`` setting to determine the 240 output of the ``get_<fieldname>_url()`` helper 241 function. 239 ``upload_to`` Required. A filesystem-style path that will be 240 prepended to the filename before being committed to 241 the final storage destination. 242 243 **New in Django development version** 244 245 This may also be a callable, such as a function, 246 which will be called to obtain the upload path, 247 including the filename. See below for details. 248 249 ``backend`` **New in Django development version** 250 251 Optional. A storage backend object, which handles 252 the storage and retrieval of your files. See 253 `managing files`_ for details on how to provide 254 this object. 242 255 ====================== =================================================== 243 256 244 This path may contain `strftime formatting`_, which will be replaced by the 245 date/time of the file upload (so that uploaded files don't fill up the given 246 directory). 257 .. _managing files: ../files/ 247 258 259 The ``upload_to`` path may contain `strftime formatting`_, which will be 260 replaced by the date/time of the file upload (so that uploaded files don't fill 261 up the given directory). 262 263 **New in Django development version** 264 265 If a callable is provided for the ``upload_to`` argument, that callable must be 266 able to accept two arguments, and return a Unix-style path (with forward 267 slashes) to be passed along to the storage backend. The two arguments that will 268 be passed are: 269 270 ====================== =================================================== 271 Argument Description 272 ====================== =================================================== 273 ``instance`` An instance of the model where the ``FileField`` is 274 defined. More specifically, this is the particular 275 instance where the current file is being attached. 276 277 **Note**: In most cases, this object will not have 278 been saved to the database yet, so if it uses the 279 default ``AutoField``, *it might not yet have a 280 value for its primary key field*. 281 282 ``filename`` The filename that was originally given to the file. 283 This may or may not be taken into account when 284 determining the final destination path. 285 ====================== =================================================== 286 248 287 The admin represents this field as an ``<input type="file">`` (a file-upload 249 288 widget). 250 289 251 Using a ``FileField`` or an ``ImageField`` (see below) in a model takes a few252 s teps:290 Using a ``FileField`` or an ``ImageField`` (see below) in a model without a 291 specified backend takes a few steps: 253 292 254 293 1. In your settings file, you'll need to define ``MEDIA_ROOT`` as the 255 294 full path to a directory where you'd like Django to store uploaded -
tests/modeltests/files/models.py
Property changes on: tests\modeltests\files ___________________________________________________________________ Name: svn:ignore + *.pyc
1 """ 2 42. Storing files according to a custom backend 3 4 FileField and its variations can take a "backend" argument to specify how and 5 where files should be stored. 6 """ 7 8 import tempfile 9 10 from django.db import models 11 from django.core.filestorage.filesystem import FileSystemBackend 12 13 temp_dir = tempfile.gettempdir() 14 15 class CustomBackend(FileSystemBackend): 16 def get_available_filename(self, filename): 17 # Append numbers to duplicate files rather than underscores, like Trac 18 19 parts = filename.split('.') 20 basename, ext = parts[0], parts[1:] 21 number = 2 22 23 while self.file_exists(filename): 24 filename = '.'.join([basename, str(number)] + ext) 25 number += 1 26 27 return filename 28 29 standard_backend = FileSystemBackend(location=temp_dir) 30 custom_backend = CustomBackend(location=temp_dir) 31 32 class Storage(models.Model): 33 normal = models.FileField(backend=standard_backend, upload_to='tests') 34 custom = models.FileField(backend=custom_backend, upload_to='tests') 35 36 __test__ = {'API_TESTS':""" 37 # An object without a file has limited functionality 38 39 >>> obj1 = Storage() 40 >>> obj1.normal 41 <File: > 42 >>> obj1.normal.get_filesize() 43 Traceback (most recent call last): 44 ... 45 ValueError: The 'normal' attribute has no file associated with it. 46 47 # Saving a file enables full functionality 48 49 >>> obj1.normal.save_file('django_test.txt', 'content') 50 >>> obj1.normal 51 <File: tests/django_test.txt> 52 >>> obj1.normal.get_filesize() 53 7 54 >>> obj1.normal.open_file().read() 55 'content' 56 57 # Save another file with the same name 58 59 >>> obj2 = Storage() 60 >>> obj2.normal.save_file('django_test.txt', 'more content') 61 >>> obj2.normal 62 <File: tests/django_test_.txt> 63 >>> obj2.normal.get_filesize() 64 12 65 66 # Custom backends can behave differently 67 68 >>> obj1.custom.save_file('django_test.txt', 'trac-style filenames') 69 >>> obj1.custom 70 <File: tests/django_test.2.txt> 71 >>> obj2.custom.save_file('django_test.txt', 'another file') 72 >>> obj2.custom 73 <File: tests/django_test.3.txt> 74 75 # Clean up the temporary files 76 77 >>> obj1.normal.delete_file() 78 >>> obj1.custom.delete_file() 79 >>> obj2.normal.delete_file() 80 >>> obj2.custom.delete_file() 81 """} -
tests/modeltests/files/models.py
1 """ 2 42. Storing files according to a custom backend 3 4 FileField and its variations can take a "backend" argument to specify how and 5 where files should be stored. 6 """ 7 8 import tempfile 9 10 from django.db import models 11 from django.core.filestorage.filesystem import FileSystemBackend 12 13 temp_dir = tempfile.gettempdir() 14 15 class CustomBackend(FileSystemBackend): 16 def get_available_filename(self, filename): 17 # Append numbers to duplicate files rather than underscores, like Trac 18 19 parts = filename.split('.') 20 basename, ext = parts[0], parts[1:] 21 number = 2 22 23 while self.file_exists(filename): 24 filename = '.'.join([basename, str(number)] + ext) 25 number += 1 26 27 return filename 28 29 standard_backend = FileSystemBackend(location=temp_dir) 30 custom_backend = CustomBackend(location=temp_dir) 31 32 class Storage(models.Model): 33 normal = models.FileField(backend=standard_backend, upload_to='tests') 34 custom = models.FileField(backend=custom_backend, upload_to='tests') 35 36 __test__ = {'API_TESTS':""" 37 # An object without a file has limited functionality 38 39 >>> obj1 = Storage() 40 >>> obj1.normal 41 <File: > 42 >>> obj1.normal.get_filesize() 43 Traceback (most recent call last): 44 ... 45 ValueError: The 'normal' attribute has no file associated with it. 46 47 # Saving a file enables full functionality 48 49 >>> obj1.normal.save_file('django_test.txt', 'content') 50 >>> obj1.normal 51 <File: tests/django_test.txt> 52 >>> obj1.normal.get_filesize() 53 7 54 >>> obj1.normal.open_file().read() 55 'content' 56 57 # Save another file with the same name 58 59 >>> obj2 = Storage() 60 >>> obj2.normal.save_file('django_test.txt', 'more content') 61 >>> obj2.normal 62 <File: tests/django_test_.txt> 63 >>> obj2.normal.get_filesize() 64 12 65 66 # Custom backends can behave differently 67 68 >>> obj1.custom.save_file('django_test.txt', 'trac-style filenames') 69 >>> obj1.custom 70 <File: tests/django_test.2.txt> 71 >>> obj2.custom.save_file('django_test.txt', 'another file') 72 >>> obj2.custom 73 <File: tests/django_test.3.txt> 74 75 # Clean up the temporary files 76 77 >>> obj1.normal.delete_file() 78 >>> obj1.custom.delete_file() 79 >>> obj2.normal.delete_file() 80 >>> obj2.custom.delete_file() 81 """} -
tests/modeltests/model_forms/models.py
766 766 <class 'django.newforms.fields.UploadedFile'> 767 767 >>> instance = f.save() 768 768 >>> instance.file 769 u'.../test1.txt' 769 <File: .../test1.txt> 770 770 771 771 # Edit an instance that already has the file defined in the model. This will not 772 772 # save the file again, but leave it exactly as it is. … … 775 775 >>> f.is_valid() 776 776 True 777 777 >>> f.cleaned_data['file'] 778 u'.../test1.txt' 778 <File: .../test1.txt> 779 779 >>> instance = f.save() 780 780 >>> instance.file 781 u'.../test1.txt' 781 <File: .../test1.txt> 782 782 783 783 # Delete the current file since this is not done by Django. 784 784 785 >>> os.unlink(instance.get_file_filename())785 >>> instance.file.delete_file() 786 786 787 787 # Override the file by uploading a new one. 788 788 … … 791 791 True 792 792 >>> instance = f.save() 793 793 >>> instance.file 794 u'.../test2.txt' 794 <File: .../test2.txt> 795 795 796 796 >>> instance.delete() 797 797 … … 803 803 True 804 804 >>> instance = f.save() 805 805 >>> instance.file 806 '' 806 <File: > 807 807 808 808 >>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test3.txt', 'content': 'hello world'}}, instance=instance) 809 809 >>> f.is_valid() 810 810 True 811 811 >>> instance = f.save() 812 812 >>> instance.file 813 u'.../test3.txt' 813 <File: .../test3.txt> 814 814 >>> instance.delete() 815 815 816 816 # ImageField ################################################################### … … 832 832 <class 'django.newforms.fields.UploadedFile'> 833 833 >>> instance = f.save() 834 834 >>> instance.image 835 u'.../test.png' 835 <File: .../test.png> 836 836 837 837 # Edit an instance that already has the image defined in the model. This will not 838 838 # save the image again, but leave it exactly as it is. … … 841 841 >>> f.is_valid() 842 842 True 843 843 >>> f.cleaned_data['image'] 844 u'.../test.png' 844 <File: .../test.png> 845 845 >>> instance = f.save() 846 846 >>> instance.image 847 u'.../test.png' 847 <File: .../test.png> 848 848 849 849 # Delete the current image since this is not done by Django. 850 850 851 >>> os.unlink(instance.get_image_filename())851 >>> instance.image.delete_file() 852 852 853 853 # Override the file by uploading a new one. 854 854 … … 857 857 True 858 858 >>> instance = f.save() 859 859 >>> instance.image 860 u'.../test2.png' 860 <File: .../test2.png> 861 861 862 862 >>> instance.delete() 863 863 … … 869 869 True 870 870 >>> instance = f.save() 871 871 >>> instance.image 872 '' 872 <File: > 873 873 874 874 >>> f = ImageFileForm(data={'description': u'And a final one'}, files={'image': {'filename': 'test3.png', 'content': image_data}}, instance=instance) 875 875 >>> f.is_valid() 876 876 True 877 877 >>> instance = f.save() 878 878 >>> instance.image 879 u'.../test3.png' 879 <File: .../test3.png> 880 880 >>> instance.delete() 881 881 882 882 """} -
tests/regressiontests/bug639/tests.py
39 39 Make sure to delete the "uploaded" file to avoid clogging /tmp. 40 40 """ 41 41 p = Photo.objects.get() 42 os.unlink(p. get_image_filename())43 No newline at end of file 42 os.unlink(p.image.get_absolute_path()) 43 No newline at end of file -
tests/regressiontests/serializers_regress/models.py
158 158 class EmailPKData(models.Model): 159 159 data = models.EmailField(primary_key=True) 160 160 161 class FilePKData(models.Model):162 data = models.FileField(primary_key=True, upload_to='/foo/bar')161 # class FilePKData(models.Model): 162 # data = models.FileField(primary_key=True, upload_to='/foo/bar') 163 163 164 164 class FilePathPKData(models.Model): 165 165 data = models.FilePathField(primary_key=True) -
tests/regressiontests/serializers_regress/tests.py
223 223 # (pk_obj, 620, DatePKData, datetime.date(2006,6,16)), 224 224 # (pk_obj, 630, DateTimePKData, datetime.datetime(2006,6,16,10,42,37)), 225 225 (pk_obj, 640, EmailPKData, "hovercraft@example.com"), 226 (pk_obj, 650, FilePKData, 'file:///foo/bar/whiz.txt'),226 # (pk_obj, 650, FilePKData, 'file:///foo/bar/whiz.txt'), 227 227 (pk_obj, 660, FilePathPKData, "/foo/bar/whiz.txt"), 228 228 (pk_obj, 670, DecimalPKData, decimal.Decimal('12.345')), 229 229 (pk_obj, 671, DecimalPKData, decimal.Decimal('-12.345')),