创建自定义模板标记以替换for循环 - Django

时间:2018-02-13 20:06:57

标签: python django django-template-filters

我正在尝试通过为我的Django Web应用程序上经常使用的'for循环'创建自定义模板标记来简化我的代码。我认为这将是一个简单的直接过程,但有些东西不正常...我可以使用一些帮助来捕捉我的错误。

这是我的代码。 views.py

 class ArticleView(DetailView):
    model = Articles

    def get_context_data(self, **kwargs):
      context = super(ArticleView, self).get_context_data(**kwargs)
      context['s_terms'] = scientific_terms.objects.all()
      return context

模板标签

@register.filter(name='term')
def term(value):
  {% for term in s_terms %}
        {{ term.short_description }}
  {% endfor %}

template.html

{% Neurons|term %}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您正在将Python代码与Django模板语言混合使用。模板标签是普通的Python代码,因为它们是在Python模块中定义的。一个工作的例子是:

@register.filter(name='term')
def term(terms):
  output = ''
  for term in terms:
      output = '{0} {1}'.format(output, term.short_description)
  return output

然后你可以像这样使用它:

{{ s_terms|term }}

也许你想要的只是创建一个可重用的Django模板。

例如,创建名为 terms.html 的新模板:

<强>模板/ terms.html

{% for term in terms %}
    <p>{{ term.short_description }}</p>
{% endfor %}

然后,在另一个模板中,您可以包含此部分模板:

templates / index.html (名称只是一个例子)

{% extends 'base.html' %}

{% block content %}
    <h1>My application</h1>
    {% include 'terms.html' with terms=s_terms %}
{% endblock %}