我想为所有基于函数的视图(FBV)提供一些上下文,类似于TEMPLATE_CONTEXT_PROCESSORS
(CP)为所有模板提供上下文的方式。后者对我不起作用,因为在渲染模板之前我需要这个上下文。
特别是,在我的网站上,我有一个函数接收请求并返回焦点项Category
的模型。我的CP为所有模板提供了此功能,但我发现自己从我的FBV拨打了同一个电话,并希望删除此冗余。
This question类似,但它预先假定从视图访问CP输出的方法。这看起来很糟糕,我不确定它是最好的方法。
Django的做法是什么?
答案 0 :(得分:5)
使用Middleware ...
class MyModelMiddleware(object):
def process_request(self, request):
request.extra_model = self.get_model(request.user)
答案 1 :(得分:0)
基于mwjackson的答案和docs,对于Django 1.11,我认为中间件应该是:
# middleware/my_middleware.py
class MyModelMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# TODO - your processing here
request.extra_model = result_from_processing
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
在settings.py中,将路径添加到MIDDLEWARE =()上的中间件。按照this site的提示,我在应用程序内创建了一个名为Middleware的文件夹,并添加了一个名为MyModelMiddleware的类,名为my_middleware.py。因此,我添加到MIDDLEWARE的路径是my_app.middleware.my_middleware.MyModelMiddleware。
# settings.py
MIDDLEWARE = (
...
'my_app.middleware.my_middleware.MyModelMiddleware',
)