Django:如何为所有视图(而不是模板)提供上下文?

时间:2016-05-06 13:37:35

标签: django

我想为所有基于函数的视图(FBV)提供一些上下文,类似于TEMPLATE_CONTEXT_PROCESSORS(CP)为所有模板提供上下文的方式。后者对我不起作用,因为在渲染模板之前我需要这个上下文。

特别是,在我的网站上,我有一个函数接收请求并返回焦点项Category的模型。我的CP为所有模板提供了此功能,但我发现自己从我的FBV拨打了同一个电话,并希望删除此冗余。

This question类似,但它预先假定从视图访问CP输出的方法。这看起来很糟糕,我不确定它是最好的方法。

Django的做法是什么?

2 个答案:

答案 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',
)