将变量从中间件传递到模板

Ger*_*tod 2 django variables middleware

我是Django入门者。到目前为止,我了解了从视图模板的传递变量。但是现在我需要将变量传递到主布局。我可以在每个页面的定义中传递它。但是它有太多重复。因此,我开始学习中间件。

我创建了middlewares.py并将其包含在设置中。在middlewares.py文件中,如何将变量传递到我的主布局?

以下是我当前的middlewares.py内容,我尝试了许多方法并对其进行了注释,因为它们无法正常工作。

from django.db import connections
from django.shortcuts import render, redirect

class NotificationsMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):

        request.context_data['notification_count'] = 2
        response = view_func(request, *view_args, **view_kwargs)

        return response

    # def process_request(self, request):
    #     request.notification_count = 2
    #     return

    # def process_template_response(self, request, response):
    #     # response.context['notification_count'] = 2
    #     response.context_data['notification_count'] = 2
    #     # return response
    #     return render(request, 'main/locations.html')
Run Code Online (Sandbox Code Playgroud)

jac*_*boo 5

您可以创建一个模板上下文处理器,首先使用一个方法创建一个python文件,该方法返回包含所需信息的字典,然后使用示例,在您的项目设置中添加到该文件的路由:

在您的应用上创建文件context_processors.py

 from myapp.models import MyModel

 def my_context(request):
    context_data = dict()
    context_data['notification_count'] = MyModel.objects.all().count()
    return context_data
Run Code Online (Sandbox Code Playgroud)

在您的settings.py中添加上下文处理器

TEMPLATE_CONTEXT_PROCESSORS = (
    #  ...
    'myapp.context_proccessors.my_context',
)
Run Code Online (Sandbox Code Playgroud)

您可以在任何模板中使用“变量”:

<p>Count: {{ notification_count }}</p>
Run Code Online (Sandbox Code Playgroud)

  • 从Django 1.8开始,TEMPLATE_CONTEXT_PROCESSORS被弃用。实际将DjangoTemplates后端的OPTIONS中的“ myapp.context_proccessors.my_contex”添加到“ context_processors”选项中。参见文档:https://docs.djangoproject.com/zh-CN/1.8/ref/settings/#template-context-processors (3认同)