【问题标题】:Issues with loops in Django [duplicate]Django中的循环问题[重复]
【发布时间】:2012-10-10 09:55:11
【问题描述】:

可能重复:
how to create counter loop in django template?

我想根据某些条件打印一些数据,

我想像使用其他语言一样使用它:

for(i=1;i<=count;i++)
print i

为此我在 django 中编写

{% for i in count %}
<p>{{ i }}</p>
{% endfor %}

但它给了我一个错误'int' object is not iterable。计数来自views.py,如果我单独打印计数而不是显示输出。

我想打印一些值直到计数不为零,那么我如何在 django 中做到这一点。

还有一件事我们可以在 django 中使用 while 循环,因为我也尝试将它用于此任务,但它给了我 invalid block tag: 'while'

的错误

那么请告诉我如何完成这项任务?

谢谢

编辑 在我的 view.py 中我是这样使用的

count=Product_attributes.objects.count()

然后将此计数传递给我的模板

【问题讨论】:

  • 您可以在 django 模板中执行此操作,请在发布前查看 SO 中的旧问题。这是一个stackoverflow.com/questions/5077978/…
  • 这里算什么?它是查询集还是列表?只有这些项目是可迭代的。你如何在视图中获得它?解释清楚。
  • 我认为Numeric for loop in Django templates 会帮助你。
  • @arulmr 我已经编辑了我的问题,你可以从我得到这个计数的地方看到

标签: python django django-templates


【解决方案1】:

Django 模板不是编程语言。在视图或模型中编写所有逻辑,并将数据传递到模板中:

def view(request):
    values = []
    for i in range(10):
         values.append(i) # your custom logic here
    return render_to_response("/path/to/template", {'values': values})

在模板中:

{% for value in values %}
    <p>{{ value }}</p>
{% endfor %}

【讨论】:

  • 感谢您的关注。我将范围(计数)传递给我的模板,它对我有用。再次感谢
【解决方案2】:

“for i in var”语法仅适用于“var”是可迭代的情况,例如列表、元组、集合、字典...

我建议如下:不要将项目计数传递给模板,而是传入可迭代的例如列表。如果你只有一个计数,你可以在视图中使用 range(count) 创建一个迭代。在代码中

# Extract from view
def view(request):
    # Set up values. Values is a list / tuple / set of whatever you are counting
    values = Product_attributes.objects.all()
    return render_to_response("/path/to/template", {'values': values})

# Extract from template
{% for value in values %}
   <p>{{value}}</p>
{% endfor %}

“while”标签在 django 中不是有效的内置标签。可以在此处查看有效的内置标签列表:https://docs.djangoproject.com/en/dev/ref/templates/builtins/

这种做事方式不仅仅特定于模板:它在“常规 python”中具有相似之处,其中迭代集合的规范方式是:

for item in iterable:
    # do something with the item
    pass

有关执行 for 循环的“python 方式”的更多信息可以在这里找到:http://wiki.python.org/moin/ForLoop

【讨论】:

    【解决方案3】:

    如果不适合将范围添加到您的视图代码中(我不喜欢在视图中添加纯模板类型的内容),我可能会创建一个范围过滤器:

    @register.filter
    def range(val):
        return range(val)
    

    然后你会这样使用它:

    {% for i in count|range %}
    <p>{{ i }}</p>
    {% endfor %}
    

    如果你不想为此编写任何 python 代码,你还可以使用一个非常丑陋的 hack,它利用 Django 的中心(或 ljust 和 rjust)过滤器创建一个长度为提供的值的字符串.你可以这样使用它:

    {% for x in count|center:count %}
    <p>{{ forloop.counter }}</p>
    {% endfor %}
    

    我不建议这样做,我只是在证明这是可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多