`
ghh0000
  • 浏览: 23632 次
  • 来自: ...
社区版块
存档分类
最新评论

如何在Django模板中注入全局变量

阅读更多
首先需要明白在django模板系统中,有两种封装模板变量的类:

一个是django.template.Context,这是最常用的,我们在使用render_to_response方法的时候传入的第二个dictionary参数,就会被这个Context类封装一次,然后传到模板当中;

另一个是django.template.RequestContext,它和Context类相比有两个不同之处。

第一个不同的是,在生成一个RequestContext变量的时候,需要传入一个HttpRequest对象作为它的第一个参数:
c = RequestContext(request, {'foo': 'bar', })


第二个区别是,它会增加一些自动注入模板的变量,这些变量从哪儿来呢?在django的settings.py里有一部分是配置TEMPLATE_CONTEXT_PROCESSORS的,这个配置中的那一个个的tuple元素其实是一个个可以被调用的方法,而这些方法都会接收一个HttpRequest对象作为参数,而最终return一个dictionary,这个dictionary里面的元素就会成为RequestContext中自动注入模板的变量。我们看看settings.py中TEMPLATE_CONTEXT_PROCESSORS的某一个元素 django.contrib.auth.context_processors.auth 对应的代码吧:
# in django/contrib/auth/context_processors.py
def auth(request):
    """ ignore doc string """
    def get_user():
        ....
 
    return {
        'user': SimpleLazyObject(get_user),
        'messages': messages.get_messages(request),
        'perms':  lazy(lambda: PermWrapper(get_user()), PermWrapper)(),
    }

可以看到,auth方法最后返回的一个字典中,包含了三个元素,所以如果在使用render_to_response方法时,传入了第三个RequestContext参数,那么在它所渲染的模板中,就可以获取到对应的user、messages、perms变量了。

所以最后文艺解决方法是,在每一个需要注入全局变量的views方法中,调用render_to_response的时候,都传入第三个RequestContext对象参数即可:
def views_meth1(request):
    d1 = {'method': 1}
 
    return render_to_response('template_1.html', d1, context_instance=RequestContext(request))
 
def views_meth2(request):
    d2 = {'method': 2}
 
    return render_to_response('template_2.html', d2, context_instance=RequestContext(request))
 
def views_meth3(request):
    d3 = {'method': 3}
 
    return render_to_response('template_2.html', d3, context_instance=RequestContext(request))

这样需要注入的全局对象,就可以通过扩展TEMPLATE_CONTEXT_PROCESSORS来实现,灵活性更高,更易扩展。当然,在一般的项目开发中,个人觉得普通方法也足够用,所以就根据项目来做取舍吧。

根据上面的信息,我们就可以把settings配置文件中的变量在模版中使用
#-*- coding: utf-8 -*-
from django.conf import settings as _settings

def settings(request):
    return {'settings' : _settings}


在settings中设置
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
    'dianzhang.common.context_processors.simple.settings',
)
分享到:
评论

相关推荐

    django开发之settings.py中变量的全局引用详解

    总结来说,Django允许我们在`settings.py`中定义全局变量,然后通过设置`TEMPLATES`的`context_processors`,将这些变量注入到模板上下文中。这样做既保持了代码的整洁,又提高了效率,特别是在处理频繁使用的全局...

    django4.0官方中文文档

    7. **中间件(Middleware)**:中间件是Django框架中的一个特殊组件,它可以全局地影响请求和响应流程。开发者可以利用中间件实现日志记录、权限控制、会话管理等多种功能。 8. **国际化和本地化(i18n & l10n)**...

    Django 中文手册

    Django的中间件(Middleware)是一系列钩子,可以插入到请求和响应处理流程中,实现全局的功能扩展,如日志记录、性能监控等。此外,Django的Admin界面是一个强大的后台管理系统,通过简单的配置,即可自动生成用于...

    Django -1.11.6下载

    9. 中间件:中间件是Django框架中的一种特殊组件,可以全局影响请求和响应处理过程。1.11.6版本中,中间件系统已经相当成熟,可以用来实现如日志记录、会话管理、跨站请求伪造(CSRF)保护等功能。 10. 安全性:...

    django基础教程

    模板是HTML文件,其中包含特定的Django模板语言(DTL),用于动态生成内容。开发者可以使用模板变量、控制结构和过滤器来控制HTML的输出。 七、URL路由 Django的URLconf(URL配置)系统允许开发者定义URL模式,将...

    Django-中文教程.pdf

    - **上下文处理器的作用**:介绍上下文处理器的概念及其在传递全局变量到模板中的应用。 - **配置上下文处理器**:设置项目的配置文件以启用自定义上下文处理器。 #### 五、模型 **知识点9:数据模型设计** - **...

    Django-2.0.4 Django-2.0.4

    7. **中间件(Middleware)**:中间件是Django的一种机制,它可以在请求被视图处理之前和之后进行操作,用于实现全局的功能,如日志记录、权限检查等。 8. **管理器(Admin)**:Django内置的行政管理界面可以方便...

    Django_2_中文版

    通过这份中文版的Django 2教程,无论是初学者还是有一定经验的开发者,都能找到详尽的指导,逐步提升在Django开发中的技能和效率。阅读过程中,结合实际的项目实践,将更有利于理解和掌握这些知识点。

    Django Web框架 v4.2.11.zip

    Django模板语言支持变量插入、条件判断、循环结构以及包含其他模板等功能,使得开发者可以轻松地将数据与视图结合,生成HTML响应。 4. 视图(View): 视图是处理HTTP请求并返回响应的部分。它们可以是函数或类,...

    django1.11 doc html版

    模板可以包含变量和控制结构,允许你在HTML中插入动态内容。 6. **URL调度** Django的URL调度器将URL模式映射到视图函数,使得URL设计清晰且易于维护。你可以使用正则表达式定义URL模式,并与视图进行关联。 7. *...

    Django Web开发指南.pdf.zip

    Django的中间件系统允许开发者插入全局行为,如日志记录、会话管理、CSRF保护等。 对于Web开发,安全性是至关重要的。Django内置了防止SQL注入、跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的防护措施。同时,...

    轻量级Django

    5. **中间件(Middleware)**: 中间件是Django中的一个强大特性,可以全局影响请求和响应。但在轻量级项目中,应谨慎添加中间件,避免过度复杂化。 6. **性能优化**: 使用缓存策略(如Django的内置缓存框架)来提高...

    Django-2.1.2.tar.gz

    在`templates`目录下创建模板文件,可以使用变量和控制结构来渲染数据。 8. 表单处理:Django提供了强大的表单处理能力,包括自动的HTML表单生成、数据验证和处理。只需定义模型Form或自定义Form类,即可轻松处理...

    Django视频学习资源

    - 使用Django的模板引擎编写HTML页面,可以在模板中嵌入变量和标签。 - 视图函数可以通过`render`函数将数据传递给模板进行渲染。 8. **静态文件管理**: - 配置项目的`STATIC_URL`和`STATIC_ROOT`设置,以便...

    Django Web开发指南 python

    6. **中间件(Middleware)**:中间件是Django中的一个特殊组件,它可以全局影响请求和响应流程,提供如身份验证、日志记录等跨视图的功能。 **Django的安全特性:** 1. **内置认证系统**:Django提供了完整的用户...

    Django-1.4.tar.gz

    在Django 1.4中,模板引擎已经相当成熟,支持继承、块结构以及对变量的复杂操作。 6. **表单处理**:Django的表单处理模块能自动生成HTML表单,同时处理POST数据,降低了处理表单的复杂性。 7. **中间件...

    基于Django的BBS.zip

    通过使用模板语言,如变量、控制结构(if/else、for循环)、过滤器和标签,可以轻松地将数据注入到页面中。 4. 视图(View): 视图是应用的核心,它们处理HTTP请求并返回响应。通常,视图会从数据库获取数据,...

    Django 1.8.16

    这是一个标准的Python包安装过程,它会将Django框架添加到你的系统路径中,使你在任何项目中都能方便地使用Django。 关于Django的核心特性,以下是一些重要的知识点: 1. **模型(Models)**:Django的模型是...

    Django-1.2.3

    在Django 1.2.3中,开发者可以找到许多关键特性和改进,这些特性旨在提高开发效率、安全性和可维护性。 1. **模型系统**:Django的模型系统是数据访问层的核心,允许开发者通过Python定义数据库结构。在1.2.3中,...

    Django-1.2.7

    Django模板语言(DTL)允许开发者创建动态HTML页面。它支持变量、条件语句、循环、过滤器和标签。在1.2.7版本中,模板系统已经相当成熟,提供了高效的模板渲染和继承机制。 6. URL路由: Django的URLconf(URL...

Global site tag (gtag.js) - Google Analytics