自定义Django包含功能

时间:2015-10-27 20:20:19

标签: python django

我的所有JavaScript都是通过Django的编译器运行的,允许我以下列方式注入HTML字符串Underscore模板:

CREATE TABLE dbo.MyMassiveTable
  (
     pk    INT IDENTITY CONSTRAINT PK_MyMassiveTable PRIMARY KEY,
     Blob1 NVARCHAR(MAX)
  )

INSERT INTO dbo.MyMassiveTable
VALUES     (REPLICATE(CAST(N'X' AS VARCHAR(MAX)), 3848564 / 2)); 

此代码通过var htmlStr = '{% filter convert_js_template %}{% include "my_file.html" %}{% endfilter %}' 过滤器运行包含的HTML文件的输出,该过滤器只删除换行符并转义单引号,以便最终的JS字符串有效。然而,为了使其更具可读性,我希望能够简单地编写如下内容:

convert_js_template

如何创建一个var htmlStr = '{% convert_js_template "my_file.html" %}' 函数来完成此任务?我的感觉是它需要通过以下方式开始:

  1. 抓取所需文件的内容
  2. 解析任何Django模板标记的内容
  3. 我尝试了以下内容:

    convert_js_template

    我最初收到错误@register.filter('convert_js_template') def convert_js_template(path): value = include(path) return value.replace('\n', '').replace('\r', '').replace("'", "\\'") ,然后我将NameError: global name 'include' is not defined添加到文件中,现在收到了其他错误:from django.conf.urls import include

    这就是我被困的地方:)。

1 个答案:

答案 0 :(得分:0)

我的解决方案不涉及自定义“包含”功能。相反,它手动加载并呈现所需的模板文件:

from django.template import Library, loader, Context

...

register = Library()

...

@register.filter('js_template')
def js_template(template_path):
    tpl = loader.get_template(template_path)
    return tpl.render(Context({})).replace('\n', '').replace('\r', '').replace("'", "\\'")
js_template.is_safe = True

请注意,template_path应该与您为Django设置目录以查找模板的目录相关。

用法:

var htmlString = '{{  "path/to/my_template.html" | js_template }}';