Frage

i für das Hochladen von Dateien ein Feld fileinput haben ... die View-Datei sieht wie folgt aus ...

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

Allerdings, wenn ich versuche, die Datei andere als einfache Textdatei laden (etwa für beispielsweise PDF-Dateien) zur Überprüfung auf ‚/ file_check /‘ alles, was ich bekommen ist „Validation bei / file_check /“. Die Rückverfolgung des Fehlers

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: 

Ich bin ein beginer in django und finde es schwer zu lösen. Ihre Hilfe ist herzlich willkommen.

War es hilfreich?

Lösung

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)

Ihre Ansicht:

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

Und ... "Sachen machen!" sollte von einem CustomFieldFile behandelt werden, die FieldFile

erweitert

@edit

  • verwenden, um die gute Import Klasse
  • vergessen zu schreiben oder in Bearbeitung verloren, dass der Scheck in dem sauberen Verfahren hergestellt wird ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top