Django使用HttpResponseRedirect进行重定向

时间:2009-10-16 10:24:12

标签: django forms redirect

所以这不会太难,但我无法弄明白......

我希望我的表单在django(位于 / file_upload / )上传文件,将其添加到数据库,然后重定向到新页面,其中参数是字段的id我在数据库中添加了(位于 / file / 163 / ,比如说)。

我已经设置了urls.py,以便 / file / 163 / 在您直接导航时工作正常,但我不知道如何从 /文件到达那里/上传/

我的代码是这样的:

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]))

我无法使用this solution,因为在我处理views.py中的表单之前,我不知道字段ID是什么,因此重定向必须发生在views.py中。我想。

有什么想法吗?

4 个答案:

答案 0 :(得分:20)

中有reverse错误的参数
return HttpResponseRedirect(reverse('/file/', args=[my_file.id]))

reverse获取视图或名称或视图,而不是网址。

你没有说你的视图函数被调用什么来查看文件,但是假设它被称为view,那么上面应该是

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

或者

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

具体取决于您在urls.py中所写的内容

您可以在urls.py中命名视图并使用这些名称而不是函数名称 - see the documentation for more examples

如果你喜欢改变你的urls.py,那么使用反向是一个好主意 - 你将能够改变任何路径,你的所有观点都会继续工作。

答案 1 :(得分:10)

您对表单的看法应如下所示:

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

答案 2 :(得分:1)

或者您只需使用redirect(to[, permanent=False], *args, **kwargs)快捷键功能:

  1. 通过传递一个模型对象(如果定义了模型的get_absolute_url方法),那么在你的情况下:

    my_file = FileField.objects.create()
    return redirect(my_file)
  2. 通过传递视图名称和一些位置和关键字参数,在您的情况下:

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

    或使用位置参数,如果您的网址定义需要它:

    my_file = FileField.objects.create()
    return redirect('file', file_id=my_file.pk)
  3. 传递相对,绝对或完整的网址:
    my_file = FileField.objects.create()
    return redirect('/files/%i/' % my_file.pk)

答案 3 :(得分:0)

在我看来,你想要实现的是Django Tutorial正在逐步解释的内容。如果您有时间,请查看:Django Tutorial https://docs.djangoproject.com/en/1.6/intro/tutorial03/