diff options
| author | Joseph Kocherhans <joseph@jkocherhans.com> | 2009-03-30 22:56:05 +0000 |
|---|---|---|
| committer | Joseph Kocherhans <joseph@jkocherhans.com> | 2009-03-30 22:56:05 +0000 |
| commit | 22ac97b17cbc3491629f98b15cc9a699b14ebd73 (patch) | |
| tree | 1845663d43a471d3080068d034b1a78b52a1c5b0 | |
| parent | 86842e21f41602f4f6fbf0e61bf25bc4bc8e9256 (diff) | |
[1.0.X] Fixed #10149. FileFields? in a form now validate max_length. Based on a patch by Massimo Scamarcia. Backport of r10227 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10232 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/db/models/fields/files.py | 2 | ||||
| -rw-r--r-- | django/forms/fields.py | 5 | ||||
| -rw-r--r-- | tests/modeltests/model_forms/models.py | 7 | ||||
| -rw-r--r-- | tests/regressiontests/forms/fields.py | 15 |
5 files changed, 28 insertions, 2 deletions
@@ -351,6 +351,7 @@ answer newbie questions, and generally made Django that much better: Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/> Vinay Sajip <vinay_sajip@yahoo.co.uk> Kadesarin Sanjek + Massimo Scamarcia <massimo.scamarcia@gmail.com> David Schein Bernd Schlapsi scott@staplefish.com diff --git a/django/db/models/fields/files.py b/django/db/models/fields/files.py index 1ea4415a18..a033d892aa 100644 --- a/django/db/models/fields/files.py +++ b/django/db/models/fields/files.py @@ -199,7 +199,7 @@ class FileField(Field): getattr(instance, self.name).save(data.name, data, save=False) def formfield(self, **kwargs): - defaults = {'form_class': forms.FileField} + defaults = {'form_class': forms.FileField, 'max_length': self.max_length} # If a file has been provided previously, then the form doesn't require # that a new file is provided this time. # The code to mark the form field as not required is used by diff --git a/django/forms/fields.py b/django/forms/fields.py index ccb54d8b32..d9f4890734 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -446,9 +446,11 @@ class FileField(Field): 'invalid': _(u"No file was submitted. Check the encoding type on the form."), 'missing': _(u"No file was submitted."), 'empty': _(u"The submitted file is empty."), + 'max_length': _(u'Ensure this filename has at most %(max)d characters (it has %(length)d).'), } def __init__(self, *args, **kwargs): + self.max_length = kwargs.pop('max_length', None) super(FileField, self).__init__(*args, **kwargs) def clean(self, data, initial=None): @@ -465,6 +467,9 @@ class FileField(Field): except AttributeError: raise ValidationError(self.error_messages['invalid']) + if self.max_length is not None and len(file_name) > self.max_length: + error_values = {'max': self.max_length, 'length': len(file_name)} + raise ValidationError(self.error_messages['max_length'] % error_values) if not file_name: raise ValidationError(self.error_messages['invalid']) if not file_size: diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index a202185ec6..1e72a553b1 100644 --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -93,7 +93,7 @@ class PhoneNumber(models.Model): class TextFile(models.Model): description = models.CharField(max_length=20) - file = models.FileField(storage=temp_storage, upload_to='tests') + file = models.FileField(storage=temp_storage, upload_to='tests', max_length=15) def __unicode__(self): return self.description @@ -974,6 +974,11 @@ True >>> instance.file <FieldFile: tests/test1.txt> +# Check if the max_length attribute has been inherited from the model. +>>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': SimpleUploadedFile('test-maxlength.txt', 'hello world')}) +>>> f.is_valid() +False + # Edit an instance that already has the file defined in the model. This will not # save the file again, but leave it exactly as it is. diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py index fa5a62ac51..0dc49f2ca7 100644 --- a/tests/regressiontests/forms/fields.py +++ b/tests/regressiontests/forms/fields.py @@ -845,6 +845,21 @@ ValidationError: [u'The submitted file is empty.'] >>> type(f.clean(SimpleUploadedFile('name', 'Some File Content'), 'files/test4.pdf')) <class 'django.core.files.uploadedfile.SimpleUploadedFile'> +>>> f = FileField(max_length = 5) +>>> f.clean(SimpleUploadedFile('test_maxlength.txt', 'hello world')) +Traceback (most recent call last): +... +ValidationError: [u'Ensure this filename has at most 5 characters (it has 18).'] + +>>> f.clean('', 'files/test1.pdf') +'files/test1.pdf' + +>>> f.clean(None, 'files/test2.pdf') +'files/test2.pdf' + +>>> type(f.clean(SimpleUploadedFile('name', 'Some File Content'))) +<class 'django.core.files.uploadedfile.SimpleUploadedFile'> + # URLField ################################################################## >>> f = URLField() |
