在 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 的宏的适当等价物?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 1.8 中使用 jinja2 作为模板引擎
django:使用 Jinja if 语句在模板上显示锚链接