【问题标题】:Django: How to provide context to all views (not templates)?Django:如何为所有视图(不是模板)提供上下文?
【发布时间】:2016-05-06 13:37:34
【问题描述】:

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

特别是,在我的网站上,我有一个函数,它接受请求并返回焦点项目Category 的模型。我的 CP 为所有模板提供了此功能,但我发现自己从我的 FBV 中进行了相同的调用,并希望删除此冗余。

This question 类似,但它预设了从视图访问 CP 输出的方法。这似乎很hacky,我不确定这是最好的方法。

Django 的方法是什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    使用Middleware...

    class MyModelMiddleware(object):
        def process_request(self, request):
    
            request.extra_model = self.get_model(request.user)
    

    【讨论】:

      【解决方案2】:

      基于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 的文件夹,并添加了一个新文件 my_middleware.py,其中包含一个名为 MyModelMiddleware 的类。所以,我添加到 MIDDLEWARE 的路径是 my_app.middleware.my_middleware.MyModelMiddleware。

      # settings.py
      MIDDLEWARE = (
          ...
          'my_app.middleware.my_middleware.MyModelMiddleware',
      )
      

      【讨论】:

        猜你喜欢
        • 2021-11-20
        • 1970-01-01
        • 2012-01-30
        • 2017-07-03
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多