2010-11-05 16 views
0

我有一個的FileInput場上傳文件...視圖文件看起來像這樣...forms.ValidationError不工作

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}) 

然而,當我嘗試上傳的不是簡單的文本文件,其他文件(說例如PDF文件)檢查在'/ file_check /'我得到的是「驗證錯誤在/ file_check /」。 錯誤的回溯是

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: 

我在Django一個beginer和發現很難解決。您的幫助受到熱烈的讚賞。

回答

1
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) 

您的看法: 「做的東西」

@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() 

而且...... 應該擴展FieldFile

@edit

  • 利用好進口類
  • 忘了寫或編輯丟失了,該檢查是在清潔方法制成的CustomFieldFile處理...