Login

Upload a zip file with newforms

Author:
kylefox
Posted:
March 11, 2007
Language:
Python
Version:
Pre .96
Score:
3 (after 3 ratings)

This is a minor modification to Upload a file using newforms as posted by mboersma.

I altered the ZipUploadForm by removing lines 33 - 34:

if 'zip_file' in self.clean_data:
            zip_file = self.clean_data['zip_file']

and adding a return statement to clean_zipfile, which returns the validated zip file. I also added the line:

zip_file.clean = clean_zipfile

so that when the full_clean() in called on the form, clean_zipfile will automatically run.

All other code (the view & template) remain the same.

Disclaimer I'm not that familiar with newforms, so please forgive me if some the explanation as to why this works is incorrect ;) Who knows, maybe the first guy had it right.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from cStringIO import StringIO
import zipfile

from django import newforms as forms
from zippers.upload.models import QueuedImageSet # The model that uses the zipfile (has a FileField called 'zip_file')

class ZipUploadForm(forms.Form):
	
	zip_file = forms.Field( widget=forms.FileInput() )
	owner = forms.CharField( max_length=88 )
	
	def clean_zipfile(zip_file):
		if zip_file.get('content-type') != 'application/zip':
			msg = 'File upload must be a valid ZIP archive.'
			raise forms.ValidationError( msg )
		else:
			try:
				zip = zipfile.ZipFile( StringIO( zip_file['content'] ) )
			except:
				raise forms.ValidationError( "Could not unzip file." )
			bad_file = zip.testzip()
			zip.close()
			del zip
			if bad_file:
				raise forms.ValidationError( msg )
		return zip_file # Return the clean zip_file
			
	# The line below hooks the function above into the base form.
	# When the form calls full_clean() it will automatically clean the 
        # zip_file field and add it to the form's clean_data dictionary.
	zip_file.clean = clean_zipfile
					
	def save(self):
		owner = self.clean_data['owner']
                # Get the cleaned zip_file stuff
		filename = self.clean_data['zip_file']['filename']
		zipdata = self.clean_data['zip_file']['content']
		q = QueuedImageSet(file_owner=owner)
		q.save_zip_file_file(filename, zipdata)
		q.save()

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 3 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
  5. Help text hyperlinks by sa2812 1 year, 7 months ago

Comments

vdemeester (on March 12, 2007):

Hi there,

If you don't want to write "zip_file.clean = clean_zipfile", you just have to rename clean_zipfile by clean_zip_file.

newforms seems to called all clean_FIELDNAME when full_clean() called..

But your way of doing is also a good way :p

#

kylefox (on March 12, 2007):

Thanks, wasn't sure about that. You know, I wondered if the original author had intended to name the function & field the same because I had a slight feeling django would do that!

#

Pistahh (on June 21, 2007):

Bug: The variable "msg" is uninitialized in line 25. (It is only initialized in line 14 but it is the "then" branch of the if statement, while line 25 is the "else" branch.

#

Please login first before commenting.