在 Django 開發中,表單提交後重定向回原頁面並攜帶錯誤訊息是常見需求。本文整理 Django 1.5 時代的幾種重定向寫法,並說明如何傳遞參數,供開發者參考。
HttpResponseRedirect 的建構子第一個參數為重定向目標路徑,支援完整 URL(如 https://example.com/search/)或絕對路徑(如 /search/)。
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required
@login_required
def update_time(request):
# ... 表單處理邏輯
return HttpResponseRedirect('/commons/invoice_return/index/') # 跳轉到首頁
return HttpResponseRedirect('/commons/invoice_return/index/?message=error')
在目標視圖中即可用 request.GET.get('message') 取得錯誤資訊。
使用 redirect 與 reverse 可依視圖名稱反解 URL,避免硬編碼路徑。
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
@login_required
def update_time(request):
# ... 表單處理邏輯
return redirect(reverse('commons.views.invoice_return_index', args=[]))
redirect 同樣支援字串 URL 格式(如 /index/?a=add),reverse 可直接指定視圖函式,args 對應 URL 捕獲參數。詳細用法請參考官方文件。
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
)
此法不易傳遞動態參數。
request.session['error_message'] = 'test'
redirect('%s?error_message=test' % reverse('page_index'))
上述方式屬於客戶端重定向(瀏覽器重新導向)。若需在伺服端直接呼叫另一視圖函式並取得回應,可直接呼叫目標視圖:
# urls.py
urlpatterns = patterns('',
url(r'^baseinfo/', 'account.views.baseinfo_account'),
url(r'^blance/', 'account.views.blance_account'),
)
# views.py
@login_required
def baseinfo_account(request, args=None):
if args:
print(args)
return render(request, 'accountuserinfo.html', {'user': user})
@login_required
def blance_account(request):
return baseinfo_account(request, {'name': 'orangleliu'})
測試結果:直接訪問 /baseinfo 正常;訪問 /blance 會執行 baseinfo_account 並取得參數,但瀏覽器網址列仍顯示 /blance。此法可實現帶參數的伺服端內部轉發。