【问题标题】:How to use generator method in django template?如何在 django 模板中使用生成器方法?
【发布时间】:2015-11-10 14:43:06
【问题描述】:

我想在django模板中使用python生成器,可以吗?

例如,我有模型,它包含如下所示的生成器对象,

class TestMe(models.Model):
    @property
    def gen(self):
        yield 1
        yield 2

上下文['gen'] = gen

然后在模板中,

  {{ gen }} # it should be print 1
  {{ gen }} # it should be print 2

不使用for循环

我已经尝试过这种方式,但它返回的 python 生成器不是 1。任何人都知道这一点。

【问题讨论】:

    标签: python django


    【解决方案1】:

    我使用了自定义过滤器,

    @register.filter(name='dj_iter')
    def dj_iter(gen):
        try:
           return next(gen)
        except StopIteration:
           return 'Completed Iteration'
    

    在 django 模板中,我使用了过滤器

    {{ gen|dj_iter }}
    

    【讨论】:

      【解决方案2】:

      生成器返回一个可迭代对象,因此您可以对其进行循环。

      在 Python 中:

      for value in context.gen:
          print(value) 
      

      或者在 Django 模板中:

      {% for value in context.gen %}
      {{ value }}
      {% endfor %}
      

      【讨论】:

      • 这有点棘手,两个代码块是不同的地方。我想在两个代码块中使用这个。不使用 for 循环我想在 django 中使用生成器。
      • 不太清楚您要做什么,请更新您的问题并提供更多详细信息。
      • 我已经更新了,我不能在 django 模板中使用 for 循环。我需要在没有 for 循环的情况下迭代像 next 这样的 gen 对象
      • EchoUA 团队的答案将适用于 Python 2。对于 Python 3,我认为您必须编写自定义模板标签。
      • 是的,我写了自定义过滤器。
      【解决方案3】:

      在模板中

      {{ gen.next }}
      {{ gen.next }}
      

      【讨论】:

      • 好答案!不幸的是,这在 Python 3 中不起作用,您调用 next(gen) 而不是 gen.next()
      • 确实,dhana 的回答好多了,解决了我的问题。
      猜你喜欢
      • 2023-03-20
      • 2013-11-24
      • 2010-12-04
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2015-06-13
      • 2014-09-11
      • 2019-05-29
      相关资源
      最近更新 更多