簡體   English   中英

帶參數的 Django 重定向()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM