引言——
在前面我们知道在模板中想要使用的变量是从视图函数中的context这个上下文的参数中传递进来的,每个视图函数需要什么参数就传什么参数。
但是,假设我们现在有这么多问题,我需要给多个不同的模板传递几个相同的变量使用,难道我要给每个模板对应的视图函数都加context,使用其传递嘛?
确实可以,但是岂不麻烦?这里就要请出我们伟大的**上下文处理器!**我们使用它,可以一次性将指定变量传给所有模板,供每个模板使用!!!
上下文处理器(Context Processor)
1.上下文处理器是个啥? && 它是干啥的?
-
上下文处理器也称作上下文渲染器。但我更倾向于称其为处理,毕竟processor的翻译是“处理。”但是称为上下文渲染器也有道理,渲染更接近于使用场景。
-
Django中的Context Processor主要是应用于模板,完成页面的绘制的一些处理,也就是所说的页面渲染。
-
而上下文,从计算机编程的角度来说——就是指环境。
也就是说,同一段处理程序对于不同的环境,反馈出不同的处理结果。 -
借用网上的一个例子:用户访问站点的时候,站点的所有页面上都要能够显示这个用户自己的IP地址。
这样的功能,我们需要从请求(request)中获取到访问用户的IP地址,然后呈现到页面中。也许大家能够想到,我们可以在每个页面对应的视图函数中进行这个处理,但是未免太过麻烦。最好的方式是将处理过程定义一次,就能够在每个页面中使用。
此时,我们可以通过自定义一个上下文处理器帮助我们完成。
面对不同来源的用户通过同一个处理器完成页面上不同IP地址的渲染。
上下文处理器就是创建模板变量,但是与使用context传参有所不同。使用上下文处理器可以给每一个模板都提供相同的变量(即一次性将制定变量传给所有模板,让每个模板都可以使用) |
2.来看一看Django中的上下文配置项
在settings.py中,包含了当前使用的上下文处理器。他的作用是可以给每一个模板都提供相同的变量。
3.自定义上下文处理器 && 使用
(1)在主目录下新建一个名为“mycontexprocessor.py”的文件专门用于编写自定义上下文处理器:
此处就实现上述所说的网上的那个例子,所以在这个文件中添加获取用户IP地址的代码。
(小提醒:自定义上下文处理器也可以放在该项目的任意可以导入的地方【一般放在 app根目录里面~】)
详细步骤:
- 在主目录下创建了一个mycontextprocessor.py的文件.
- 在mycontextprocessor.py的文件中创建一个mytest的函数
- 必须传入request这个参数
- 必须返回一个字典类型的对象.
(2)将mytest注册到settings.py中上下文配置项里:
先找到文件所在的位置,再把自定义的上下文处理器的函数添加即可。(TEMPLATES->OPTIONS->context_processors中)
(3)在页面模板中添加标记:
完成上述代码后,Django调用模板时会先通过上下文处理器进行处理,并将处理后返回的数据字典传入模板,通过模板标记获取数据。
此时,我们就可以打开开发服务器,进行访问测试了。