2009-10-16 87 views
11

所以这也不能太硬,但我不出来...Django的形式重定向使用HttpResponseRedirect

我希望我在Django(位于/file_upload/)的形式上传的文件,将它添加到数据库中,然后重定向到一个新页面,其中参数是我在数据库中添加的字段的ID(位于/file/163/,比方说)。

我已经成立了urls.py使/文件/ 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因为我不知道什么ID字段将是,直到我已经处理在views.py形式做的,所以重定向必须发生在views.py中。我认为。

有什么想法?

回答

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

完美。谢谢 – AP257 2009-10-16 16:26:59

+1

@Richard - 请注意Nick Craig-Wood的评论 - 对于您的观点,您最好使用“reverse”而非硬编码网址。 – 2009-10-16 17:15:00

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

+1,反向使生活更轻松。 – 2010-03-15 00:55:12

1

或者你可以使用简单的redirect(to[, permanent=False], *args, **kwargs)快捷功能:通过传递一个模型对象(如果模型的get_absolute_url方法被定义)

  1. ,所以你的情况:

    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. 通过传递一个相对的,绝对的,或完整的URL:
    my_file = FileField.objects.create() 
    return redirect('/files/%i/' % my_file.pk)