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)
分享到:
相关推荐
在这个练习中,你将学习到以下几个关键知识点: 1. **Django模板语言(DTL)**:DTL是Django提供的强大而灵活的模板系统,允许开发者使用Python语法结构来控制HTML的生成。通过模板标签、过滤器和变量,你可以构建...
【描述】中的关键信息提示了以下几个知识点: 1. **用户认证与授权**:在"登录、注册"部分,Django内置了User模型和相关视图,用于处理用户的身份验证和权限管理。这通常涉及到`django.contrib.auth`模块的使用,...
在本项目中,你将学习到以下几个核心知识点: 1. **Django安装与环境配置**:首先,你需要设置Python开发环境,并安装Django框架。这通常包括安装Python,设置虚拟环境,以及通过pip安装Django。 2. **Django项目...
在这个案例中,“untitled2”项目可能包含以下几个关键部分: 1. manage.py:这是一个命令行工具,用于执行各种管理任务,如创建数据库迁移、运行服务器等。 2. requirements.txt:记录了项目所需的Python库及其...
通常,Django项目结构会包括以下几个关键部分: 1. **manage.py**:Django项目的命令行接口,用于启动服务器、迁移数据库等操作。 2. **settings.py**:配置文件,定义项目设置,如数据库连接、应用列表、中间件等...
3. **模板语言**:学习Django模板语法,包括变量、控制结构(if、for)、过滤器和标签。 4. **表单处理**:如何创建自定义表单,处理用户输入,并进行验证。 5. **用户认证**:Django内置的用户认证系统,包括注册...
图书管理系统的实现主要包括以下几个部分: 1. **模型(Models)**:定义在Django的`models.py`文件中,表示数据库中的表结构。例如,可能包含`Book`模型,包含`title`、`author`、`publish_date`等字段,用于存储...
在项目设计阶段,我们关注以下几个关键部分: - **文件结构**: 项目通常遵循标准的Django应用结构,包括`app1`等应用目录,其中包含了模型(models.py)、视图(views.py)、模板(templates)和静态文件(static)...
在本项目中,我们使用了 Django 和 Django Rest Framework(DRF...如果你希望深入学习和理解这个项目,可以从以下几个方面入手:Django 的 MVC 模式、DRF 的序列化与认证机制、数据库模型设计以及如何调试和测试 API。
本书的主要内容包括但不限于以下几个方面: 1. **项目设置和布局**:讨论如何设计和组织项目代码,包括应用和目录结构的安排。建议如何设置项目的文件和目录,以便于管理和维护。 2. **模型设计**:深入探讨Django...
7. **错误调试和日志记录**:学习如何调试Django和Dramatiq中的问题,以及设置合适的日志记录,以追踪和解决问题。 8. **版本控制**:使用Git或其他版本控制系统来管理代码,保持代码的整洁和历史记录。 在实际...
2. **Django模板语言支持**:Django的模板语言(Django Template Language, DTL)是一种声明式的模板系统,用于生成HTML或其他类型的文本。Atom-unleash-django可能提供了DTL的语法高亮和自动补全功能,帮助开发者更...
在这个系统中,我们可以预见到以下几个核心功能模块: 1. **用户管理**:系统应支持学生、管理员等多种角色的注册和登录。用户认证与授权是Django内置的功能,通过`django.contrib.auth`模块,可以方便地实现用户...
Django的核心在于其模型(Model)、视图(View)、模板(Template)和URL(URLconf)这四个主要组成部分。在这个项目中,开发者可能已经定义了相应的模型来描述数据库结构,编写了视图函数来处理HTTP请求并返回响应...
Django框架是一个高级Web开发平台,它提供了许多内置功能,如ORM(对象关系映射)用于数据库操作,模板系统用于动态网页生成,以及强大的URL路由系统。这个后台管理系统特别强调了对富文本的支持,意味着用户可以...
微博应用的源码通常包括以下几个部分: - 用户模块:处理用户注册、登录、个人信息管理等。 - 微博模块:实现微博的创建、编辑、删除以及时间线展示。 - 评论模块:允许用户对微博进行评论,支持评论回复。 - ...
在学习过程中,应重点关注以下几个方面: 1. **快速启动**:了解如何设置Django项目和应用,以及如何创建第一个视图和模板。 2. **数据库操作**:学习如何定义模型,使用`makemigrations`和`migrate`命令管理数据库...
我们将深入探讨以下几个核心知识点: 1. Django框架基础: Django是一个高级的Python Web框架,它鼓励快速开发和实用主义设计。它提供了模型-视图-控制器(MVC)架构,用于处理数据库交互、URL路由、HTML模板等。...
Django的核心组件包括以下几个部分: 1. **模型(Models)**:这是数据存储的主要接口,它允许开发者定义数据库表结构并进行数据操作。Django的ORM(对象关系映射)层将Python类与数据库表关联起来,简化了数据库...
如果在启动Django服务器后看到警告信息,表明`CsrfResponseMiddleware`和`CsrfMiddleware`已被废弃,建议使用`CsrfViewMiddleware`以及模板标签。 - **解决方案**:更新`settings.py`中的`MIDDLEWARE_CLASSES`...