Я уже окончательно запутался, есть 4 основных файла:
views.py:
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from imageshare.models import Document
from imageshare.forms import DocumentForm
def listed(request):
# Handle file upload
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
form.clean(content_type=['.pdf'])
if form.is_valid():
newdoc = Document(docfile=request.FILES['docfile'])
newdoc.save()
# Redirect to the document list after POST
return HttpResponseRedirect(reverse('imageshare.views.listed'))
else:
form = DocumentForm()
# Load documents for the list page
documents = Document.objects.all()
# Render list page with the documents and the form
return render_to_response(
'imageshare/list.html',
{'documents': documents, 'form': form},
context_instance=RequestContext(request)
)
forms.py:
# -*- coding: utf-8 -*-
from django import forms
from imageshare.formatChecker import ContentTypeRestrictedFileField
class DocumentForm(forms.Form):
docfile = ContentTypeRestrictedFileField(label='Select a file')
formChecker.py:
from django.db.models import FileField
from django.forms import forms
from upload_test import settings
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _
class ContentTypeRestrictedFileField(FileField):
def __init__(self, *args, **kwargs):
self.content_types = kwargs.pop("content_types", None)
self.max_upload_size = kwargs.pop("max_upload_size", None)
super(ContentTypeRestrictedFileField, self).__init__(*args, **kwargs)
def clean(self, *args, **kwargs):
data = super(ContentTypeRestrictedFileField, self).clean(*args, **kwargs)
file = data.file
try:
content_type = file.content_type
if content_type in self.content_types:
if file._size > self.max_upload_size:
raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (
filesizeformat(self.max_upload_size), filesizeformat(file._size)))
else:
raise forms.ValidationError(_('Filetype not supported.'))
except AttributeError:
pass
return data
def clean_file(self):
file = self.cleaned_data['docfile']
try:
if file:
file_type = file.content_type.split('/')[0]
if len(file.name.split('.')) == 1:
raise forms.ValidationError(_('File type is not supported'))
if file_type in settings.TASK_UPLOAD_FILE_TYPES:
if file._size > settings.TASK_UPLOAD_FILE_MAX_SIZE:
raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.TASK_UPLOAD_FILE_MAX_SIZE), filesizeformat(file._size)))
else:
raise forms.ValidationError(_('File type is not supported'))
except:
pass
return file
model.py:
from django.db import models
from imageshare.formatChecker import ContentTypeRestrictedFileField
class Document(models.Model):
docfile = ContentTypeRestrictedFileField(upload_to='documents/%Y/%m/%d',
content_types=['image/gif', 'image/jpeg', 'image/png', ])
Во views пробовал и clean_file(), ничего не получается, чувствую, какая-то глупая ошибка, потому что задача элементарная