6

Here is the code in views:

def index(request):
    if request.method == 'POST':
        a=request.POST
#        logging.debug(a["title"])
#        logging.debug(a["file"])
        #form = UploadFileForm()
        form = UploadFileForm(request.POST, request.FILES)
        #handle_uploaded_file(request.FILES['file'])
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/')
    else:
        form = UploadFileForm()
    return render('upload.html', {'form': form})


def handle_uploaded_file(file):
#    logging.debug("upload_here")
    if file:
        destination = open('/tmp/'+file.name, 'wb+')
        #destination = open('/tmp', 'wb+')
        for chunk in file.chunks():
            destination.write(chunk)
        destination.close()

Here is the code in models:

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file  = forms.FileField(type="file")

Here is the code in upload.html:

{% block upload %}

<form enctype="multipart/form-data" method="post" action="/upload/">

    {% csrf_token %}
    <table>
        <tr><td>
            <input type="file" value="title" name="title" id="title" /><br />
            <input type="submit" value="Submit" id="Save"/>
        </td></tr>
    </table>
</form>
{% endblock %}

After I select a file, then press the submit button, an error appears:

AttributeError at /upload/

'WSGIRequest' object has no attribute 'chunks'

Request Method: POST Request URL: http://www.mywebsite.com/upload/ Django Version: 1.3 Exception Type: AttributeError Exception Value:

'WSGIRequest' object has no attribute 'chunks'

Exception Location: /usr/src/wpcms/views.py in handle_uploaded_file, line 63

Any ideas what I am doing wrong here? Am I forgetting a settings line? Or, an import line? Thank you.

settings.py is:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'cms.middleware.media.PlaceholderMediaMiddleware',
    'django.middleware.doc.XViewMiddleware',
    'django_authopenid.middleware.OpenIDMiddleware',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.request',
    'django.core.context_processors.media',
    'cms.context_processors.media',
    'django_authopenid.context_processors.authopenid',
)

CMS_TEMPLATES = (
#    ('basic.html', 'Basic Template'),
#    ('template_1.html', 'Template One'),
#    ('template_2.html', 'Template Two'),
     ('home.html', gettext('Default')),
     ('about.html', gettext('About')),
#     ('blog.html', gettext('blog')),
     ('contact.html', gettext('Contact')),
)

ROOT_URLCONF = 'urls'

CMS_APPLICATIONS_URLS = (
    ('cmsplugin_news.urls', 'News'),
)

CMS_NAVIGATION_EXTENDERS = (
    ('cmsplugin_news.navigation.get_nodes', 'News navigation'),
)

THUMBNAIL_PROCESSORS = (
    'easy_thumbnails.processors.colorspace',
    'easy_thumbnails.processors.autocrop',
    #'easy_thumbnails.processors.scale_and_crop',
    'filer.thumbnail_processors.scale_and_crop_with_subject_location',
    'easy_thumbnails.processors.filters',
)

CMS_MODERATOR = False

TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates'),
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'django.contrib.comments',
    'registration',
    'django_authopenid',
    'cms',
    'menus',
    'mptt',
    'appmedia',
    'south',
    'cms.plugins.text',
    'cms.plugins.picture',
    'cms.plugins.link',
    'cms.plugins.file',
    'easy_thumbnails',
    'filer',
    'cmsplugin_filer_file',
    'cmsplugin_filer_folder',
    'cmsplugin_filer_image',
    'cmsplugin_filer_teaser',
    'cmsplugin_filer_video',
    'cms.plugins.snippet',
    'cms.plugins.googlemap',
    'publisher',
    'reversion',
    'cms.plugins.teaser',
    'cms.plugins.video',
    'cms.plugins.twitter',
    'cmsplugin_facebook',
    'cmsplugin_news',
    'cmsplugin_comments',
    'captcha',
)
kirtcathey
  • 343
  • 1
  • 6
  • 16

1 Answers1

10

There are multiple issues. Here is a fixed version that works:

1) Change your template to use the actual form:

<form enctype="multipart/form-data" method="post" action="/upload/">
   {% csrf_token %}   
   <table>
       {{form.as_table}}
    </table>
    <input type="submit" value="Submit" id="Save"/>
</form>

2) Update your form to remove unnecessary type in the FileField:

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file  = forms.FileField()

3) Update your view to add the CSRF:

def index(request):
    if request.method == 'POST':
        a=request.POST
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/')
    else:
        form = UploadFileForm()

    c = {'form': form}
    c.update(csrf(request))
    return render_to_response('upload.html', c)

Hope this helps!

kirtcathey
  • 343
  • 1
  • 6
  • 16
mif
  • 1,121
  • 8
  • 5
  • Thanks alot. The csrf in views was a revelation too. When I apply all these changes, only a submit button appears and the file selection field does not appear. – kirtcathey Apr 07 '11 at 15:12
  • Think it is something in my settings.py.... still getting the same error and the form data is not appearing in the HTML. Will add settings to question. – kirtcathey Apr 07 '11 at 15:21
  • Looks like you need to debug what's going in your environment. Here are a few suggestions: 1) Compare the HTML source generated for the form with the one that worked ok, 2) Switch from WSGI to development environment and try to reproduce 3) Add Python debugging in your view by adding "import pdb; pdb.set_trace()" and check what's going on in your request - you can type "request.FILES.keys()" in your PDB session to see which files were sent by the browser. – mif Apr 07 '11 at 17:25
  • 1
    I got this error when i wrongly typed in views. I wrote request.FILE instead of request.FILES. – Aslam Khan Jul 10 '15 at 06:02