`
marlonyao
  • 浏览: 252232 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

几个用于调试Django模板的标签

阅读更多
Django模板有诸多限制,例如不能调用方法,不能执行任意的Python表达式。它的设计者表示这样做是故意的,我不去争论这样到底是好是坏,但在调试时我们确实需要想执行任意的Python表达式。Django提供了自定义标签的机制,再加上Python的eval函数,使得在Django模板中也能执行任意的Python表达式。

我写了三个标签,分别是set, print和import。set的语法为:
	{% set varname = python_expression %}

它会执行python_expression的值,并把它添加到的模板上下文,而后可以用varname引用。
python_expression可以为任意的Python表达式,可以使用模板上下文中的变量。

views.py
	return render_to_response('test.html' {
		'list': ['a', 'b', 'c'],
		'num': 25,
		'name': 'marlon',
	})


test.html
	{% set len = len(list) %}
	length of list: {{ len }} <br />
	{% set a = num + len %}
	Now num value: {{ a }} <br />


输出:
length of list: 3
Now num value: 28


print标签就更简单了,它的语法为:
{% print python_expression %}

它直接输出python_expression的值。上面的test.html可以写成:
	length of list: {% print len(list) %} <br />
	Now num value: {% print num + len %} <br />



import标签,顾名思义,是用来导入Python模块,它的语法为:
	{% import import_expression [ as alias_name ] %}


test.html
	{% import sys %}
	{% print sys.path %} <br />



它们的实现很简单,直接附在这里:
from django import template
import re
register = template.Library()

set_regex = re.compile(r'^\s*set\s+(\w+)\s*=\s*(.*)$')
def do_set(parser, token):
    m = re.match(set_regex, token.contents)
    if m:
        name, exp = m.group(1), m.group(2)
        return SetNode(name, exp)
    else:
        raise template.TemplateSyntaxError('{% set varname = python_expression %}')
    
class SetNode(template.Node):
    def __init__(self, varname, expression):
        self.varname = varname
        self.expression = expression

    def render(self, context):
        context[self.varname] = eval(self.expression, {}, context)
        return ''

register.tag('set', do_set)    


print_regex = re.compile(r'^\s*print\s+(.*)$')
def do_print(parser, token):
    m = re.match(print_regex, token.contents)
    if m:
        exp = m.group(1)
        return PrintNode(exp)
    else:
        raise template.TemplateSyntaxError('{% print expression %}')

class PrintNode(template.Node):
    def __init__(self, expression):
        self.expression = expression

    def render(self, context):
        obj = eval(self.expression, {}, context)
        return str(obj)

register.tag('print', do_print)


import_regex = re.compile(r'^\s*import\s+(\S+)(?:\s+as\s+(\w+))?$')
def do_import(parser, token):
    m = re.match(import_regex, token.contents)
    if m:
        exp = m.group(1)
        try:
            alias = m.group(2)
        except:
            alias = None
        return ImportNode(exp, alias)
    else:
        raise template.TemplateSyntaxError('{% import import_expression [ as alias_name ] %}')

class ImportNode(template.Node):
    def __init__(self, expression, alias=None):
        if not alias: alias = expression
        self.expression = expression
        self.alias = alias

    def render(self, context):
        module = __import__(self.expression, {}, context)
        context[self.alias] = module
        return ''

register.tag('import', do_import)


分享到:
评论

相关推荐

    Python一日一练---Django模版练习源码

    在这个练习中,你将学习到以下几个关键知识点: 1. **Django模板语言(DTL)**:DTL是Django提供的强大而灵活的模板系统,允许开发者使用Python语法结构来控制HTML的生成。通过模板标签、过滤器和变量,你可以构建...

    django简易版网盘

    【描述】中的关键信息提示了以下几个知识点: 1. **用户认证与授权**:在"登录、注册"部分,Django内置了User模型和相关视图,用于处理用户的身份验证和权限管理。这通常涉及到`django.contrib.auth`模块的使用,...

    Django实战入门项目.rar

    在本项目中,你将学习到以下几个核心知识点: 1. **Django安装与环境配置**:首先,你需要设置Python开发环境,并安装Django框架。这通常包括安装Python,设置虚拟环境,以及通过pip安装Django。 2. **Django项目...

    untitled2.rar Django课堂案例

    在这个案例中,“untitled2”项目可能包含以下几个关键部分: 1. manage.py:这是一个命令行工具,用于执行各种管理任务,如创建数据库迁移、运行服务器等。 2. requirements.txt:记录了项目所需的Python库及其...

    基于python+Django的OA办公系统.zip

    通常,Django项目结构会包括以下几个关键部分: 1. **manage.py**:Django项目的命令行接口,用于启动服务器、迁移数据库等操作。 2. **settings.py**:配置文件,定义项目设置,如数据库连接、应用列表、中间件等...

    基于django的博客系统源码_python学习项目

    3. **模板语言**:学习Django模板语法,包括变量、控制结构(if、for)、过滤器和标签。 4. **表单处理**:如何创建自定义表单,处理用户输入,并进行验证。 5. **用户认证**:Django内置的用户认证系统,包括注册...

    Django2.0简易图书管理系统

    图书管理系统的实现主要包括以下几个部分: 1. **模型(Models)**:定义在Django的`models.py`文件中,表示数据库中的表结构。例如,可能包含`Book`模型,包含`title`、`author`、`publish_date`等字段,用于存储...

    python Django web 实训项目的实验报告

    在项目设计阶段,我们关注以下几个关键部分: - **文件结构**: 项目通常遵循标准的Django应用结构,包括`app1`等应用目录,其中包含了模型(models.py)、视图(views.py)、模板(templates)和静态文件(static)...

    django+drf框架搭建的一个小说网站后端.zip

    在本项目中,我们使用了 Django 和 Django Rest Framework(DRF...如果你希望深入学习和理解这个项目,可以从以下几个方面入手:Django 的 MVC 模式、DRF 的序列化与认证机制、数据库模型设计以及如何调试和测试 API。

    Django最佳实践(Two scoops of django1.11) 高清PDF【英文版】

    本书的主要内容包括但不限于以下几个方面: 1. **项目设置和布局**:讨论如何设计和组织项目代码,包括应用和目录结构的安排。建议如何设置项目的文件和目录,以便于管理和维护。 2. **模型设计**:深入探讨Django...

    Python库 | django_dramatiq_pg-1.0.tar.gz

    7. **错误调试和日志记录**:学习如何调试Django和Dramatiq中的问题,以及设置合适的日志记录,以追踪和解决问题。 8. **版本控制**:使用Git或其他版本控制系统来管理代码,保持代码的整洁和历史记录。 在实际...

    Atom-unleash-django,Atom增强了对django的支持。为Hectocore/Unlease做出贡献.zip

    2. **Django模板语言支持**:Django的模板语言(Django Template Language, DTL)是一种声明式的模板系统,用于生成HTML或其他类型的文本。Atom-unleash-django可能提供了DTL的语法高亮和自动补全功能,帮助开发者更...

    基于django的宿舍管理系统

    在这个系统中,我们可以预见到以下几个核心功能模块: 1. **用户管理**:系统应支持学生、管理员等多种角色的注册和登录。用户认证与授权是Django内置的功能,通过`django.contrib.auth`模块,可以方便地实现用户...

    Django整合Extjs源码

    Django的核心在于其模型(Model)、视图(View)、模板(Template)和URL(URLconf)这四个主要组成部分。在这个项目中,开发者可能已经定义了相应的模型来描述数据库结构,编写了视图函数来处理HTTP请求并返回响应...

    Django-Admin_后台管理系统_django_

    Django框架是一个高级Web开发平台,它提供了许多内置功能,如ORM(对象关系映射)用于数据库操作,模板系统用于动态网页生成,以及强大的URL路由系统。这个后台管理系统特别强调了对富文本的支持,意味着用户可以...

    python3+Django微博源代码和开发环境

    微博应用的源码通常包括以下几个部分: - 用户模块:处理用户注册、登录、个人信息管理等。 - 微博模块:实现微博的创建、编辑、删除以及时间线展示。 - 评论模块:允许用户对微博进行评论,支持评论回复。 - ...

    django web开发指南pdf涵盖源代码

    在学习过程中,应重点关注以下几个方面: 1. **快速启动**:了解如何设置Django项目和应用,以及如何创建第一个视图和模板。 2. **数据库操作**:学习如何定义模型,使用`makemigrations`和`migrate`命令管理数据库...

    Python-用pythondjango实现的一个很简单的搜索引擎

    我们将深入探讨以下几个核心知识点: 1. Django框架基础: Django是一个高级的Python Web框架,它鼓励快速开发和实用主义设计。它提供了模型-视图-控制器(MVC)架构,用于处理数据库交互、URL路由、HTML模板等。...

    Django-1.5.12.tar

    Django的核心组件包括以下几个部分: 1. **模型(Models)**:这是数据存储的主要接口,它允许开发者定义数据库表结构并进行数据操作。Django的ORM(对象关系映射)层将Python类与数据库表关联起来,简化了数据库...

    django中CSRF的问题及解决

    如果在启动Django服务器后看到警告信息,表明`CsrfResponseMiddleware`和`CsrfMiddleware`已被废弃,建议使用`CsrfViewMiddleware`以及模板标签。 - **解决方案**:更新`settings.py`中的`MIDDLEWARE_CLASSES`...

Global site tag (gtag.js) - Google Analytics