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:
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)
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)
- 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/
精彩评论