2011-02-06 71 views
5

我有一個簡單的表單,提交時重定向到成功頁面。django - POST後重定向時傳遞信息

我希望能夠在我的成功頁面中使用上一步中提交的數據。

據我所知,重定向時無法傳遞POST數據,那麼如何實現這一點?

目前我不得不直接從相同的URL返回成功頁面,但這會導致刷新時可怕的重新提交數據。

正在使用request.session唯一的出路?

+0

任何機制,允許您保留請求之間的數據會做(因爲這是你問的結束)。會話可能是最簡單的,但絕對不是唯一的方法。 – 2011-02-06 18:20:30

回答

7

您可以:

  1. 傳遞數據的request.session(完全數據或只是ID爲對象)
  2. 重定向與URL類似ID = [ID] - 在[ID]指向你的對象。

更新:

關於PT。 1以上,我的意思是你可以做(​​在POST處理程序):

my_object = MyModel.objects.create(...) 
request.session['my_object_id'] = my_object.id 

或者你可以嘗試通過整個對象(它應該工作,但我不是100%肯定):

my_object = MyModel.objects.create(...) 
request.session['my_object'] = my_object 
+0

你指的是哪個對象?有沒有包含可以評估的POST數據的對象? – Acorn 2011-02-06 10:57:35

+0

是的,它被命名爲request.POST.data – 2011-02-06 11:29:56

8

我一直這樣做,不需要會話對象。這是一種非常常見的模式POST-redirect-GET。通常我做的是:

  1. 有對象名單和表格視圖發佈數據
  2. 成功發佈到形式保存數據,並生成一個重定向對象詳細視圖

這樣保存後POST和保存後重定向。

一個例子來看,假設一樣的東西模型:

def all_thingies(request, **kwargs): 
    if request.POST: 
     form = ThingieForm(request.POST) 
     if form.is_valid(): 
      thingie = form.save() 
      return HttpResponseRedirect(thingie.get_absolute_url()) 
    else: 
     form = ThingieForm() 
    return object_list(request, 
         queryset = Thingie.objects.all().order_by('-id'), 
         template_name = 'app/thingie-list.html', 
         extra_context = { 'form': form }, 
         paginate_by = 10)