Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

[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
  • Loading branch information...
commit 22ac97b17cbc3491629f98b15cc9a699b14ebd73 1 parent 86842e2
@jkocherhans jkocherhans authored
View
1  AUTHORS
@@ -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
View
2  django/db/models/fields/files.py
@@ -199,7 +199,7 @@ def save_form_data(self, instance, data):
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
View
5 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 @@ def clean(self, data, initial=None):
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:
View
7 tests/modeltests/model_forms/models.py
@@ -93,7 +93,7 @@ def __unicode__(self):
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 @@ def __unicode__(self):
>>> 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.
View
15 tests/regressiontests/forms/fields.py
@@ -845,6 +845,21 @@
>>> 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()
Please sign in to comment.
Something went wrong with that request. Please try again.