Reputation: 709
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.
Upvotes: 0
Views: 1610
Reputation: 2609
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
Upvotes: 1