博客源为书写的载体,书写以对思维的缓存 正文

Django模板继承下的动态数据传递—上下文处理器


模板继承可以减少页面内容的重复定义,实现页面内容的重用。我的个人博客右侧的导航栏都是继承base页面从而让代码得到最大程度的复用。但是当父模板中有动态数据的话,这些动态数据在子模版中是不会显示的。我们可以通过自定义上下文处理器来解决。

Django上下文处理器(Context Processor)

上下文处理器是接收HttpRequest为参数并返回dict形式的数据的函数。它的主要用途是将所有模板共享的公共数据添加到上下文中,从而不必在每个视图中重复定义。

在settings.py文件中内置了多个上下文处理器:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            # 上下文处理器:context_processors
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'django.template.context_processors.media',
            ],
        },
    },
]

每个内置处理器的功能可查看官方文档:https://docs.djangoproject.com/zh-hans/2.1/ref/templates/api/#built-in-template-context-processors

开始动手,定义自己的上下文处理器

1.在相应的app下新建py文件,如context_processors.py

Snipaste_2018-11-15_21-27-08.jpg

2.定义一个函数如navigation_bar,接收request参数。

Snipaste_2018-11-15_21-33-26.jpg

函数里写上处理动态数据的代码。

3.将自定义的上下文处理器添加到settings.py文件中

Snipaste_2018-11-15_21-45-11.jpg

直接添加即可。

4.模板中的使用

{% for article in hot_articles %}
    ...
{% endfor %}

最后

1537447139109ac9dbab77c.gif

    • 曹达华3 2018年12月23日 20:31
    • 感谢博主,可算找到解决办法了
    • 鬼王达2号[博主]: 2018年12月23日 20:41
    • no three q
    • 曹达华4 2019年1月21日 22:19
    • 解决了我的问题
    • 曹达华8 2019年1月21日 22:20
    • 整个注册评论,遇到垃圾评论咋整???
    • 鬼王达3号[博主]: 2019年1月24日 21:51
    • 我抽空会去查看评论,遇到垃圾评论我就删除咯,我有设置审核后才能显示评论,但是发现博客也就那么点流量懒得折腾了直接评论得了。
    • 曹达华12 2019年8月29日 21:08
    • 感谢
    • 曹达华16 2019年10月29日 13:48
    • django模板的多条件组合搜索,博主有解决方法吗?
    • 鬼王达6号[博主]: 2019年11月11日 15:03
    • 抱歉不能帮到你,我已经跑路了
    • 曹达华17 2020年4月13日 15:28
    • 真男人