[英]Django: Context processors for error pages (or request in simple_tag)
在我的Django項目中,有幾個django應用程序。 我想編寫自定義錯誤頁面,並且希望它們包含指向錯誤發生的應用程序的正確鏈接,例如,如果我的應用程序a
發生了500錯誤,我希望錯誤頁面包含指向/a/index.html
的鏈接/a/index.html
,如果應用b
發生服務器錯誤,我希望頁面包含指向/b/index.html
的鏈接。 而且我只希望為每個錯誤頁面文件創建一個副本,這意味着我需要從模板中獲取應用程序的名稱。
為此,我編寫了一個自定義上下文處理器,將app_name
var添加到模板中。 我在正常頁面上對其進行了測試,但是當我繼續在錯誤頁面上對其進行測試時,結果表明上下文處理器未啟動。
同樣,我編寫了一個模板標簽app_aware_url
,該標簽使用url模式的名稱並嘗試對其進行解析,但是同樣,對於錯誤頁面, simple_tag(takes_context=True)
接收的上下文不包含請求(告訴我我在哪個應用程序時需要使用哪個)。
有沒有解決的辦法,還是完全可以解決我的問題?
(Django是1.11)
正確的方法似乎是自定義錯誤處理程序 。 關於這個的文檔有點...輕嗎? 因此,我必須做一些實驗才能使其正常工作。
事實證明,這只能在基本urls.py
全局進行,因此您不能為特定應用定制一個(很可惜),但是您可以從請求中得出該應用。
在您的基本urls.py
:
from .views import ErrorHandler
handler500 = lambda request: ErrorHandler.as_view()(request)
現在,每發生500個事件,這將推遲到views.ErrorHandler
:
class ErrorHandler(TemplateView):
template_name = '500.html'
def get_app_name(self):
module = self.request.resolver_match.func.__module__
app, *path = module.split('.')
return app
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['app_name'] = self.get_app_name()
return context
在這里, .get_app_name()
正在.get_app_name()
。 它檢查請求的resolver_match
它通過urls
路徑的路徑,並根據該路徑確定它在哪個應用程序中。
從這里開始,天空才是極限。 為了簡便起見,我僅將TemplateView
子類化,但是如果需要,可以將其推遲到django.views.defaults.server_error()
。 隨心所欲。
對於那些可能會犯同樣錯誤的人:我最終要做的是將錯誤頁面視圖中的“ app_name”變量傳遞給上下文。 因此,該變量在非錯誤頁面的上下文中,因為它是由上下文處理器設置的,而在錯誤頁面中則是變量,因為它是手動傳遞的。 雖然看起來不是一個好的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.