[英]django redirect() with parameters
已經提出了幾個類似的問題,但在花了很長時間后我找不到我的問題的答案。
在下面的代碼中,當我使用參數“username”從“myView”重定向到“anotherView”時,它按預期工作正常。 但是我也需要在此重定向中包含“范圍”參數,因為重定向后使用的模板需要此“范圍”。 每當我嘗試這樣做時,都會遇到幾個錯誤,例如:
-- "不要在調用 reverse() 時混合使用 *args 和 **kwargs"
有沒有辦法以我想要的方式管理它?
def myView(request):
if request.user.is_authenticated():
if request.method == 'POST':
#my code comes here
....
return redirect('anotherView', username=request.user.username, {"range": range(int(layout))})
def anotherView(request,username):
if request.user.is_authenticated():
#my code comes here
....
return redirect(something)
redirect
只是HttpResponseRedirect
的包裝器,它會自動調用reverse
來創建要重定向到的 URL。 因此,您傳遞給它的參數不是任意的,它們必須與您傳遞給reverse
的參數相同,特別是,只有創建 URL 所需的參數。
許多人似乎難以理解數據不能隨意傳遞給視圖。 HTTP 是一種無狀態協議:每個請求都獨立存在,就好像用戶從未訪問過該站點的任何其他頁面一樣。 創建會話的概念是為了為站點等有凝聚力的單元提供“狀態”感。 對於會話,數據存儲在某種形式的持久存儲中,並且將用於查找數據的“密鑰”提供給客戶端(通常是用戶的瀏覽器)。 在下一個頁面加載時,客戶端將密鑰發送回服務器,服務器使用它來查找數據以顯示狀態。
因此,如果您需要一個視圖中的數據在另一個視圖中可用,則需要將其添加到會話中,執行重定向,並從下一個視圖中查找會話中的數據。
無需重定向到目標 url,只需直接調用目標視圖函數:
def myView(request):
if request.user.is_authenticated():
if request.method == 'POST':
#my code comes here
....
return anotherView(request, username, range)
def anotherView(request,username,range):
if request.user.is_authenticated():
#my code comes here
....
return HttpResponse(something)
這是一個老問題,但現在這個用例有一個小的django_url_params模塊。
重定向采用要重定向到的視圖的名稱,以及要傳遞給另一個視圖的任何屬性。 在您的情況下anotherView
只有兩個參數 - request 和 username 但是在重定向中您將更多信息傳遞給它。
您可以嘗試以下操作:
def anotherView(request, username, *args, **kwargs):
...
這將允許您將更多屬性傳遞給它。
編輯
在原始視圖中如何:
kwargs = {"range": range(int(layout))}
return redirect('anotherView', username=request.user.username, **kwargs)
你想把“范圍”變量傳遞給什么? 另一個視圖? 沒有參數可以接受它。 我認為您可能正在尋找reverse()函數,但很難說。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.