2

我有类似的 html 片段,我想将其制作为单独的模板,包括:

...
<div class='item'>
  <div class='header'>It's a header 1</div>
  <div class='text'>It's a text for paragraph 1.</div>
</div>

<div class='item'>
  <div class='header'>It's a header 2</div>
  <div class='text'>You have {{points}} point{{points|pluralize}}</div>
</div>
...

我制作了一个包含模板item.html

<div class='item'>
  <div class='header'>{{header}}</div>
  <div class='text'>{{text}}</div>
</div>

并将第一个片段替换为:

{% include "item.html" with title="It's a header 1" text="It's a text for paragraph 1." %}
{% include "item.html" with title="It's a header 2" text="You have {{points}} point{{points|pluralize}}" %}

在我们使用“points”上下文变量的情况下如何应用过滤器“pluralize”以及如何应用变量“points”的值?

现在我们有了You have {{points}} point{{points|pluralize}}输出。

我可以在没有自定义模板标签/过滤器的情况下做到这一点吗?

更新

它可以是另一种方便的“DRY”方案(可能不包括模板)。

决议

感谢 karthikr 的建议。我已经创建了下一个标签(解决)。它解析变量的内容:

from django import template
from django.utils.safestring import mark_safe
from django.utils.html import escape

register = template.Library()
@register.tag( name="resolve" )

def do_resolve( parser, token ):
    nodelist = parser.parse(('endresolve',))

    parser.delete_first_token()

    return ResolveNode( nodelist )

class ResolveNode( template.Node ):
    def __init__( self, nodelist ):
        self.nodelist = nodelist

    def render( self, context ):
        output = self.nodelist.render( context ) # applye children here     
        output = template.Template( output ).render( context )
        return output

因此,我们可以使用标签更改我们的item.html

<div class='item'>
  <div class='header'>{{header}}</div>
  <div class='text'>{% resolve %}{{text}}{% endresolve %}</div>
</div>

现在,如果我们作为带有参数的字符串传递,它会正常处理。

4

1 回答 1

1

这是一个想法:

在模板标签中,您可以解析文本{{}}并解析上下文。

这可以让您了解渲染模板标签节点

于 2013-04-06T21:24:30.520 回答