使用this guide as my reference,我为Django模板编写了一个set标记解析器,它适用于TWIG的set语法,即:
{% set someVar %} variableAssignment {% endset %}
我只使用Django作为它的模板系统,到目前为止,我已经能够通过正确的导入来正确显示我的模板。这是我目前的代码:
from django.template import Context, Template, Library, Node, TemplateSyntaxError, Variable, VariableDoesNotExist, resolve_variable
from django.template.loader import *
from django.conf import settings
settings.configure(TEMPLATE_DIRS="/my/templates")
register = Library()
class SetValueNode(Node):
def __init__(self, variable, nodelist):
self.variable = variable
self.nodelist = nodelist
def render(self, context):
context[self.variable] = self.nodelist.render(context)
return ""
@register.tag(name="set")
def set_tag(parser, token):
print "set_tag called: parser",parser," token",token
nodelist = parser.parse(("endset",))
parser.delete_first_token()
return SetValueNode(arg, nodelist)
def sendServiceEmail(username, first, last, service, service_tuple):
TEMPLATES_DIR = "/my/templates/"
emailStr = "myemail.html.twig"
print "Opening file :"+TEMPLATES_DIR+emailStr
t = Template(fp.read())
fp.close()
c = Context({
/*Add context from parameters*/
})
msg = t.render(c)
print msg
但我得到的错误是:
django.template.base.TemplateSyntaxError: 'set_tag' is not a valid tag library: Template library set_tag not found, tried django.templatetags.set_tag
在做了一些研究并思考了一段时间之后,似乎django正在寻找的图书馆是“标准”'图书馆。我认为我需要告诉某人(django设置,模板或.render)我希望他们使用'图书馆'并检查库以查看模板标签是否已注册。有没有办法将这些信息传递给Django而不创建django应用程序?
答案 0 :(得分:2)
以下信息适用于Django 1.4 你有三个选择。
您需要创建一个具有已定义结构的应用程序,但它不一定是一个完整的django应用程序。假设你称之为myapp
这是必须的文件结构
myapp/
__init__.py
templatetags/
__init__.py
your_library.py
在您的主脚本中执行以下操作
from django.conf import settings
from django.template.loader import get_template
# You need to configure Django a bit
settings.configure(
# Access to template tags
INSTALLED_APPS=('myapp', ),
# Access to templates
TEMPLATE_DIRS=(TEMPLATES_DIR, ),
)
template = get_template("myemail.html.twig")
# Prepare context ....
return t.render(context)
如果您不愿意使用这么大的结构,应该可以只创建一个带有模板标签的模块并将其传递给django.template.base.add_to_builtins
方法,请参阅https://github.com/django/django/blob/master/django/template/base.py#L1349。
或者您可以考虑使用jinja2 http://jinja.pocoo.org/docs/代替,但我不知道标签在那里工作。
答案 1 :(得分:1)
感谢@zimma的精彩提示。我想提供一个模块加载选项的完整示例。
假设您从read.py
添加了这个重要的模板标记from django import template
register = template.Library()
@register.filter(name='bracewrap')
def bracewrap(value):
return "{" + value + "}"
这是html模板文件“temp.html”:
{{var|bracewrap}}
最后,这是一个将与所有人联系在一起的Python脚本
import django
from django.conf import settings
from django.template import Template, Context
import os
#load your tags
from django.template.loader import get_template
django.template.base.add_to_builtins("read")
# You need to configure Django a bit
settings.configure(
TEMPLATE_DIRS=(os.path.dirname(os.path.realpath(__file__)), ),
)
#or it could be in python
#t = Template('My name is {{ my_name }}.')
c = Context({'var': 'stackoverflow.com rox'})
template = get_template("temp.html")
# Prepare context ....
print template.render(c)
输出为
{stackoverflow.com rox}