2009-10-16 85 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)