有沒有一種方法可以訪問自定義上下文處理器中的視圖傳遞的當前上下文,以便我可以添加缺少的變量,如果我想要而不是覆蓋現有變量?Django上下文處理器:是否可以訪問ContextProcessor中的當前上下文?
我試圖實現的:
我建我的網址是這樣的/ city_slug /我要檢查,如果城市變量在上下文中已經存在,否則我想城市添加到我的上下文(可能會使用最後使用的會話變量中存儲的城市,否則默認爲某個城市,甚至可能會設置會話變量以供下次使用。)
我認爲這是非常普遍的問題,你們如何解決它?
有沒有一種方法可以訪問自定義上下文處理器中的視圖傳遞的當前上下文,以便我可以添加缺少的變量,如果我想要而不是覆蓋現有變量?Django上下文處理器:是否可以訪問ContextProcessor中的當前上下文?
我試圖實現的:
我建我的網址是這樣的/ city_slug /我要檢查,如果城市變量在上下文中已經存在,否則我想城市添加到我的上下文(可能會使用最後使用的會話變量中存儲的城市,否則默認爲某個城市,甚至可能會設置會話變量以供下次使用。)
我認爲這是非常普遍的問題,你們如何解決它?
您無法從上下文處理器訪問當前上下文,我猜中間件也不適合您。也許在你的視圖中創建你自己的模板渲染函數是有意義的,並且你總是向它傳遞上下文和當前請求,並將你想要的功能放到它中,並使用通常的渲染函數渲染模板django爲您提供!
我不確定自定義模板上下文處理器是否可以做到這一點。從documentation:
上下文處理器有一個非常簡單的接口:這只是一個Python函數,它接受一個參數,一個HttpRequest對象,並返回一個字典,得到添加到模板上下文。每個情境處理器必須返回一個字典。
(Emphasis mine)。
您應該考慮編寫自定義中間件。如果有人知道一種方法來創建上下文處理器,我想知道這一點。
你不能用Django上下文處理器做到這一點:他們只能訪問請求對象,而不能訪問他們的結果添加到的現有模板上下文。
在會話中存儲城市聽起來沒問題,如果這就是你想要的。模板將負責任何進一步的違約;如果你需要一些奇特的東西,你可能想看看把它包裝在一個可重複使用的custom template tag中。
您可以使用TemplateResponse和TemplateResponse middleware來實現此目的。
這很好,但似乎只有在視圖以某種方式構建才能返回'TemplateResponse'時才起作用。不幸的是,'shortcuts.render_to_response'返回一個'HttpResponse',即使它呈現一個模板,所以這不是最強大的解決方案(例如,如果你正在編寫一個Django庫)。所以庫作家:堅持自定義模板標籤。 – 2013-06-18 13:57:30