首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Django 重定向方法詳解:HttpResponseRedirect、redirect 與 reverse 實戰

     編輯:更多程式設計知識

在 Django 開發中,表單提交後重定向回原頁面並攜帶錯誤訊息是常見需求。本文整理 Django 1.5 時代的幾種重定向寫法,並說明如何傳遞參數,供開發者參考。

一、使用 HttpResponseRedirect

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/')  # 跳轉到首頁

透過 URL 參數傳遞錯誤訊息

return HttpResponseRedirect('/commons/invoice_return/index/?message=error')

在目標視圖中即可用 request.GET.get('message') 取得錯誤資訊。

二、redirect 搭配 reverse

使用 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 捕獲參數。詳細用法請參考官方文件。

三、其他重定向方式

在 URLconf 中直接設定重定向

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),
)

此法不易傳遞動態參數。

利用 Session 傳遞訊息

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。此法可實現帶參數的伺服端內部轉發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved