在 Django 的模板系统中,啥是 Jinja 的宏的适当等价物?

Posted

技术标签:

【中文标题】在 Django 的模板系统中,啥是 Jinja 的宏的适当等价物?【英文标题】:What would be an appropriate equivalent of Jinja's macros in Django's templating system?在 Django 的模板系统中,什么是 Jinja 的宏的适当等价物? 【发布时间】:2012-04-04 00:23:57 【问题描述】:

假设我需要在页面中反复呈现一定数量的 html,例如,用于用户的个人资料信息。 Jinja 的宏似乎完全适合这种用法。但是,Django 没有宏。

现在,我出于同样的目的使用自定义过滤器 - 这是最好的方法,还是我遗漏了什么?

谢谢。


ps。我正在将使用 webapp2 和 Jinja 在 GAE 上运行的应用程序迁移到 Django。

【问题讨论】:

Jinja 扩展了 django 模板以解决 django 模板系统的一些限制。宏的块标签是 jinja 特定的。模拟这一点的唯一方法是(如您所说)自定义标签和过滤器,有时它们会变得相当庞大。 【参考方案1】:

在对文档进行了一番摸索后,我终于找到了"correct" way to do this: custom inclusion tags,它可以让您从模板中创建标签。

【讨论】:

如果你愿意,你可以用 jinja 代替。 此链接已失效。这是一个新的:docs.djangoproject.com/en/1.10/howto/custom-template-tags/…【参考方案2】:

为了记录,我实际上花了相当多的时间来调整一个预先存在的 sn-p 以在 django 中以相当健壮的方式执行宏,如果你真的想要宏,请check it out。

作为建议,大多数时候你想用宏做什么,你真的应该用一个包含标签来做,如前所述;然而,有时你真的想要一个宏,为此你必须使用像我这样的模板标签库(这是为 django 执行此操作的少数几个之一)。

【讨论】:

【参考方案3】:

Django 没有宏,所以它要么是自定义过滤器,要么是在它自己的模板中分离你的重复代码,并使用通过“with”传递的不同参数一遍又一遍地包含它,这可能会比宏慢。但是你实际上可以在 django 中完美使用 jinja2 模板系统。

【讨论】:

【参考方案4】:

您还可以采用其他两种方法:blocks 和 includes。对于块,您必须将其一直包含在继承链中。使用包含,您只需根据需要加载,但您必须确保从视图中传递适当的上下文变量。但是,就 DRY 而言,您当前的方法可能是最有用的。

【讨论】:

谢谢;我只是想确认一下。 Django 没有从 Jinja 获取宏有什么特别的原因吗? @aviraldg Django 的模板系统在设计上并不强大。

以上是关于在 Django 的模板系统中,啥是 Jinja 的宏的适当等价物?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 Jinja2 模板?

Jinja2 模板使用 Django 模板标签

如何在 Django 1.8 中使用 jinja2 作为模板引擎

django:使用 Jinja if 语句在模板上显示锚链接

在 Jinja2 模板引擎中使用 django-widget-tweaks

在 Jinja2 模板中使用 DateTimeFields 显示本地时间 - Django