views:

1820

answers:

2

So this can't be too hard but I can't figure it out...

I want my form in django (located at /file_upload/) to upload a file, add it to the database, and then redirect to a new page where the parameter is the id of the field that I've added in the database (located at /file/163/, say).

I've set up urls.py so that /file/163/ works just fine if you navigate there directly, but I don't know how to get there from /file/upload/.

My code is like this:

def add(request):
    if request.method == 'POST': # If the form has been submitted...
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            # do stuff & add to database
  my_file = FileField.objects.create()
            return HttpResponseRedirect(reverse('/file/', args=[my_file.id]))

I can't use this solution because I don't know what the field id is going to be until I've handled the form in views.py, so the redirect has to happen in views.py. I think.

Any thoughts?

+2  A: 

Your view with the form should look something like this:

def add(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            # do stuff & add to database
            my_file = FileField.objects.create()
             # use my_file.pk or whatever attribute of FileField your id is based on
            return HttpResponseRedirect('/files/%i/' % my_file.pk)
    else:
        form = UploadFileForm()

    return render_to_response('upload_file.html', {
        'form': form,
    })
Dominic Rodger
perfect. thank you
Richard
@Richard - note Nick Craig-Wood's comment - you might be better off using `reverse` than hard-coding URLs in to your views.
Dominic Rodger
+3  A: 

You've got the arguments to reverse wrong in

return HttpResponseRedirect(reverse('/file/', args=[my_file.id]))

reverse takes a view or the name or a view, not a url.

You don't say what your view function is called for viewing the file, but lets say it is called view, then the above should be

return HttpResponseRedirect(reverse('view', args=[my_file.id]))

or maybe

return HttpResponseRedirect(reverse(view, args=[my_file.id]))

Depending on exactly what you wrote in urls.py

You can name the views in urls.py and use those names instead of the function names- see the documentation for more examples

Using reverse is a good idea if you like shuffling your urls.py around - you'll be able to change any of the paths and all your views will just keep working.

Nick Craig-Wood
+1, reverse makes life easier.
Ninefingers