Pergunta

i have a fileinput field for uploading files ... the view file looks like this ...

from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from forms import RegisterForm
from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext
from django import forms
from django.contrib.auth import authenticate
from django.contrib import auth
from settings import MEDIA_ROOT

class UploadFileForm(forms.Form):
    file = forms.Field(widget=forms.FileInput, required=True)

@csrf_protect
def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            '''
            just added the late three lines for check
            '''
            username = request.POST['username']
            password = request.POST['password1']
            user = authenticate(username=username, password=password)
            auth.login(request, user)
            request.session['username'] = username
            return HttpResponseRedirect("/file_check/")
    else:
        form = RegisterForm()
    return render_to_response("register.html", RequestContext(request, {'form':form}))

@csrf_protect
def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password1']
        form = UserCreationForm(request.POST)
        user = authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            request.session['username'] = username
            return HttpResponseRedirect('/file_check/')
    else:
        form = UserCreationForm()
    return render_to_response("login.html", RequestContext(request, {'form':form}))

def logout(request):
    auth.logout(request)
    #del request.session['username']
    return HttpResponseRedirect("/")

@csrf_protect       
def file_check(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')

    if 'file' in request.FILES:
        file = request.FILES['file']

        if file.content_type != 'application/octet-stream':
            raise forms.ValidationError('File Type Not Supported!!!')

        request.session['contentType'] = file.content_type
        filename = file.name
        fp = open('%s/%s' % (MEDIA_ROOT, filename), 'wb')
        for chunk in file.chunks():
            fp.write(chunk)
        fp.close()
        return HttpResponseRedirect('/result/')
    else:   
        form = UploadFileForm()
        username = request.session['username']
    return render_to_response('file_check.html', RequestContext(request, {'form':form, 'username':username}))

def result(request):
    username = request.session['username']
    content_type = request.session['contentType']
    return render_to_response('result.html', {'username':username, 'content_type':content_type})

However, when i try to upload the file other than simple text file (say for e.g. pdf files) for checking at '/file_check/' all i get is "ValidationError at /file_check/". The traceback of the error is

Environment:

Request Method: POST
Request URL: http://localhost:8000/file_check/
Django Version: 1.2.3
Python Version: 2.6.4
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.admin',
 'rocop_web.auth']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  100.                     response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapped_view
  76.                     response = view_func(request, *args, **kwargs)
File "/home/kailash/workspace/rocop/rocop_web/../rocop_web/auth/views.py" in file_check
  63.           raise forms.ValidationError('File Type Not Supported!!!')

Exception Type: ValidationError at /file_check/
Exception Value: 

I am a beginer in django and finding it hard to solve. Your help is warmly appreciated.

Foi útil?

Solução

from django.forms import forms
from django.db.models.fields.files import FileField

class CustomFileField(FileField):
    attr_class = CustomFieldFile

    allowed_extensions = ('txt', 'pdf')

    def clean(self, value, model_instance):
        extension = str(value).lower().split('.').pop()
        if extension not in self.allowed_extensions:
            raise forms.ValidationError('Only %s are allowed!' % ', '.join(self.allowed_extensions))
        return super(CustomFileField, self).clean(value, model_instance)

your view:

@csrf_protect
def file_check(request):
        if request.method == 'POST':
                form = UploadFileForm(data = request.POST, files = request.FILES)
                if form.is_valid():
                        # do stuff!
        else:
                form = UploadFileForm()

And ... "do stuff!" should be handled by a CustomFieldFile that extends FieldFile

@edit

  • use the good import class
  • Forgot to write or was lost in edit, that the check is made in the clean method ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top