Django: How to write a clean method for a field that allows mutiple file uploads?
Asked Answered
A

1

6

I have a form for uploading images.

If I follow Django's standard for cleaning a specific field attribute of a form, this is what my clean method would typically look like:

class UploadImagesForm(forms.Form):
    image = forms.FileField()

    def clean_image(self):
        file = self.cleaned_data['image']
        if file:
            if file._size > 15*1024*1024:
                raise forms.ValidationError("Image file is too large ( > 15mb ).")
            return file
        else:
            raise forms.ValidationError("Could not read the uploaded file.")

However, I'm using a form that allows multiple images to be uploaded at once, all through the same widget (ie, the user can Shift+click to select several files on the file browser). So whenever I need to access the files in a view or in a handler, I use something like request.FILES.getlist('images') in a for loop. How the hell do I write a clean method for this field?? I'm lost.

Here's what my form looks like.

class UploadImagesForm(forms.Form):
    images = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': 'multiple'}))

I would like the field's clean method to check the file size of each file submitted, as illustrated in the first block of code above.

Angleworm answered 18/1, 2013 at 5:6 Comment(0)
C
15

Use self.files.getlist('images') in clean method to iterate over multiple images:

def clean_images(self):
    files = self.files.getlist('images')
    for file in files:
        if file:
            if file._size > 15*1024*1024:
                raise forms.ValidationError("Image file is too large ( > 15mb ).")
        else:
            raise forms.ValidationError("Could not read the uploaded file.")
    return files
Club answered 18/1, 2013 at 5:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.