2012-02-15 147 views
5

在我的網頁中,我有一個表單,它在一些ajax請求後正在填充數據。例如,當用戶從列表中選擇一個項目時,會向數據庫發送一個簡單的ajax請求,該項目已被選中(但尚未確認)。然後,網頁上的列表將使用simpe ajax請求(只是列表,而不是整個頁面)重新加載以獲取新項目列表。django,在POST表單提交後返回上一頁

我認爲這或多或少是一個典型的購物車實施。

但是,當用戶按下submit(經典表單POST提交,而不是ajax POST出於某種原因關於實現)來確認整個列表時,我想返回到當前頁面。 (當前頁面變化)這可能嗎?我正在使用Django。

謝謝。

回答

11

提交表單時,您可以提供一個next GET參數,類似於django.contrib.auth的login()方法:

https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login

<form action="/url/to/post/form/?next={{ some_variable }}"> 

其中變量可以簡單地將當前的URL(取來自請求)或生成的URL。在視圖處理的形式,簡單地檢查一個next參數,並適當地重定向:

from django.shortcuts import redirect 
if 'next' in request.GET: 
    return redirect(request.GET['next']) 
0

當前頁面是一個非常模糊的術語,但我假設您希望將頁面引用到表單頁面,這通常(並非總是)存儲在請求本身的HTTP_REFERRER標頭中。您可以嘗試從請求中獲取並執行重定向。

+0

非常感謝。你說「不總是」,爲什麼呢? – xpanta 2012-02-15 10:18:49

+2

由用戶的瀏覽器發送推薦人。有些瀏覽器沒有,或者有一個選項可以禁用它 - 特別是Opera。另一個解決方案可能是將當前路徑作爲隱藏輸入包含在窗體中,並在request.POST中查找該值。 – AdamKG 2012-02-15 10:26:21

1

您可以使用郵政/重定向/獲取設計模式(PRG)。有關Post/Redirect/Get的更多一般信息,請參閱以下內容:http://en.wikipedia.org/wiki/Post/Redirect/Get這裏有一些很好的工藝流程圖。

實施PRG可能看起來像下面這樣的觀點的一般示例:

# urls.py 
urlpatterns = patterns('', 
    url(r'^/$', views.my_view, name='named_url'), 
) 

# forms.py 
class MyForm(forms.Form): 
    pass # the form 

# views.py 
def my_view(request, template_name='template.html'): 
    """ Example PostRedirectGet 
    This example uses a request context, but isn't 
    necessary for the PRG 
    """ 
    if request.POST: 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      try: 
       form.save() 
       # on success, the request is redirected as a GET 
       return HttpResponseRedirect(reverse('named_url')) 
      except: 
       pass # handling can go here 
    else: 
     form = MyForm() 

    return render_to_response(template_name, { 
     'form':form 
    }, context_instance=RequestContext(request)) 

如果你需要做一些更有趣的使用GET,reverse可以採取指定參數和kwargs。操縱視圖參數,url_pattern和反向調用以顯示您希望看到的結果。

另外需要注意的是,您不必重定向到相同的視圖(如本例所示)。它可以是您想要將用戶重定向到的任何命名視圖。

相關問題