Django使用HttpResponseRedirect进行重定向

AP2*_*257 11 forms django redirect

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

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

我已经设置了urls.py,以便/ file/163 /可以正常工作,如果你直接在那里导航,但我不知道如何从/ file/upload /到达那里.

我的代码是这样的:

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]))
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

Nic*_*ood 20

你有reverse错误的论据

return HttpResponseRedirect(reverse('/file/', args=[my_file.id]))
Run Code Online (Sandbox Code Playgroud)

reverse 采取视图或名称或视图,而不是网址.

你没有说你的视图函数被调用什么来查看文件,但是让我们说它被调用view,然后上面应该是

return HttpResponseRedirect(reverse('view', args=[my_file.id]))
Run Code Online (Sandbox Code Playgroud)

或者可能

return HttpResponseRedirect(reverse(view, args=[my_file.id]))
Run Code Online (Sandbox Code Playgroud)

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

您可以命名视图urls.py并使用这些名称而不是函数名称 - 有关更多示例,请参阅文档

如果你想urls.py改变你的方式,使用反向是一个好主意- 你将能够改变任何路径,你的所有观点将继续工作.


Dom*_*ger 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,
    })
Run Code Online (Sandbox Code Playgroud)