开发者

Django form redirect using HttpResponseRedirect

S开发者_如何学JAVAo 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?


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.


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


Or you can use simply the redirect(to[, permanent=False], *args, **kwargs) shortcut function:

  1. by passing a model object (if the model's get_absolute_url method is defined), so in your case:

    my_file = FileField.objects.create()
    return redirect(my_file)
  2. by passing a view name and some positional and keyword arguments, in your case:

    my_file = FileField.objects.create()
    return redirect('file', my_file.pk)

    or using positional arguments if your url definition requires it:

    my_file = FileField.objects.create()
    return redirect('file', file_id=my_file.pk)
  3. by passing a relative, absolute, or full URL:
    my_file = FileField.objects.create()
    return redirect('/files/%i/' % my_file.pk)


Seems to me that what you want to achieve is exactly what the Django Tutorial explains, step by step. If you have some time, check it out: Django Tutorialhttps://docs.djangoproject.com/en/1.6/intro/tutorial03/

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜