"FileField" validation does not account for "upload_to" when counting characters
|Reported by:||Denilson Figueiredo de Sá||Owned by:||nobody|
|Cc:||Łukasz Rekucki||Triage Stage:||Accepted|
|Has patch:||no||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
I have a model with a FileField object:
def set_file (instance, filename): return os.path.join("uploaded_files/my_obj_%d" % instance.my_obj_id, os.path.basename(filename)) class MyModel(models.Model): my_file = models.FileField(upload_to=set_file, null=True)
And I have a view that receives the POST and handles it to a trivial forms.ModelForm object. In that view I check for .is_valid().
Since the FileField creates a 100-char column at the database, any filename greater than 100 chars will be rejected, and the form instance will have a nice error message talking about this.
However, this comparison is broken, because the actual data stored at the database won't be the filename, but instead the return value of the "upload_to" callable. This returned value, in my case, has more characters than the actual filename.
Thus, in this case, filenames between 75 and 100 characters will be accepted by the form validation, but will be rejected by the database when the actual .save() occurs.
I'm not very sure about what is the best solution, but the forms.fields.FileField shouldn't rely just on the max_length parameter when validating the input.
Change History (6)
comment:2 Changed 7 years ago by
|Summary:||"FIleField" validation does not account for "upload_to" when counting characters → "FileField" validation does not account for "upload_to" when counting characters|