• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 310
  • Last Modified:

How to upload a file in Django?

Hello,

I am trying to find a simple way to upload files in Django. I would like to be able to:
-  Store them on the file system
-  or Pass the file to a method

I've tried several tutorials like this one: http://zoia.org/2007/07/29/django-file-upload/

But they didn't help much, they either didn't work at all; or they gave me problems saying the CSRF token was missing (even though I had the {% csrf_token %} in between the form tags <form> </form>).

The other problem I'm having is that I seem to be losing the session when I navigate to the new form...

I tested this theory by inserting this bit of code into the html file

<p> {{ user.is_superuser }} </p>

Open in new window


The above code returns "True" when I login on the index page; but I do not see any output when I navigate to the new form.

I am open to do this in the regular Admin area in Django, or a regular page outside; which can only be accessed by Admins.

Appreciate any help on this!
0
Errang Genevre
Asked:
Errang Genevre
  • 4
  • 2
1 Solution
 
gelonidaCommented:
Do you have the srf middleware enabled in the django settings.py file?

must be in the list of

MIDDLEWARE_CLASSES = (
    ....
    'django.middleware.csrf.CsrfViewMiddleware',
    ....
)

If this is not the problem, could you please show us the code of your django view?
perhaps you don't pass the correct context
0
 
Errang GenevreAuthor Commented:
I did have the 'django.middleware.csrf.CsrfViewMiddleware' in my MIDDLEWARE_CLASSES.

This is my view:
def create_quiz_form(request):
    if request.method == 'POST':
        form = UploadQuizData(request.POST, request.FILES)
        if form.is_valid():
            new_file = create_quiz(file = request.FILES['file'])
            new_file.save()

            return HttpResponseRedirect('/')
    else:
        form = UploadQuizData()

    data = {'form': form}
    return render_to_response('create_quiz_form.html', data)

Open in new window


This is my form:
from django import forms

class UploadQuizData(forms.Form):
    file = forms.Field(widget=forms.FileInput)

Open in new window


Its odd; I don't see myself doing anything different from any of the other methods I have.
0
 
Errang GenevreAuthor Commented:
Figured out why the session wasn't transferring; I was not returning the 'request' object to the new page.

Still trying to figure out how to do the file upload.
0
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

 
Errang GenevreAuthor Commented:
Ok, I finally got the file upload to work too; I can:
 - Process the data within the file and allow the user to download the file
   - Intermediary step to processing the data; having slight problems passing the request to another method.
 - Store the file in the media folder.

Is there a cleaner way to do this? And also, I am planning to associate each file to a quiz; so would it be more efficient to store it directly on the database; or have the database store a file name, and get the file from the file system?

def create_quiz_form(request):
    if request.method == 'POST':
        form = UploadQuizData(request.POST, request.FILES)
        if form.is_valid():
            response = HttpResponse(content_type='text/plain')
            response["Content-Disposition"]= "attachment; filename=quiz.txt"
            fd = open('%s/%s' % (MEDIA_ROOT, 'THIS_IS_THE_FILE'), 'wb')
            create_quiz(request, request.FILES['file']) # This is not working
            for line in request.FILES['file'].read():
                response.write(line)


            fd.write(request.FILES['file'].name)
            fd.close()

            return response
    else:
        form = UploadQuizData()

    data = {'form': form}
    return render(request, 'create_quiz_form.html', data)

Open in new window


Appreciate any advice on this!
0
 
gelonidaCommented:
aplogies I didn't help you more. I was very busy the last weeks.
I'm a little embarassed that you gave me points for my answer.

Well still quite busy, but here some advice:
You can read a file from a request object only once.

But you could read / write the file from a function if you pass the request object.

I would upload the file to the media directory and save it as a FileField in the data base.


following link might give you some ideas:
https://docs.djangoproject.com/en/1.7/topics/http/file-uploads/

If you use another Django, then change the version number in the link
0
 
Errang GenevreAuthor Commented:
>> You can read a file from a request object only once.

Figured that out after 30 mins of trial and error :)

>> aplogies I didn't help you more. I was very busy the last weeks.

That's fine, I was able to figure it out; but if you do have any spare time, could you please help me out with the question below?
http://www.experts-exchange.com/Programming/Languages/Scripting/Python/Q_28621740.html

I tried using this tutorial: http://www.b-list.org/weblog/2006/sep/02/django-tips-user-registration/

But I get this error: 'module' object has no attribute 'Manipulator'
0

Featured Post

[Webinar] Cloud and Mobile-First Strategy

Maybe you’ve fully adopted the cloud since the beginning. Or maybe you started with on-prem resources but are pursuing a “cloud and mobile first” strategy. Getting to that end state has its challenges. Discover how to build out a 100% cloud and mobile IT strategy in this webinar.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now