python 如何在Django模板中迭代2个变量

bsxbgnwa  于 2023-01-11  发布在  Python
关注(0)|答案(3)|浏览(106)

我有一个包含问题和选择的小测验应用程序。所以我试着把所有这些东西渲染成Django模板。在我的www.example.com中views.py,它看起来像这样

def choice(request):
    question_list = get_list_or_404(Question)
    page = get_object_or_404(Page, name='about')
    letters = ["A", "B", "C", "D", "E"]
    return render(request,
                  'qview/choice.html',
                  {
                    'question_list': question_list,
                    'page': page,
                    'letters': letters,
                   }
                  )

我有一个问题列表和字母列表。所有这些我都作为上下文发送到我的模板。

{% if question_list %}
    <ul>
    {% for question in question_list %}
      <li><a href="#">{{question.question}}</a></li>
        <ul>
          {% for choice in question.choice_set.all %}
          <li>{{ choice.text }}</li>
          {% endfor %}
        </ul>
    {% endfor %}
    </ul>
  {% else %}
    <p>No questions available</p>
  {% endif %}

所以在这里我正在通过所有的问题和所有的选择连接到这个问题。但我不知道我怎么也可以通过信件列表?我想压缩它所有。但鉴于我只有问题没有选择,所以我不能压缩到它。
那么还有什么可能呢?

k4ymrczo

k4ymrczo1#

cycle标签非常适合这种方式。它进入for循环,第一次迭代取第一个参数,第二次迭代取第二个参数,依此类推......如果它们不够,那么它从头开始。

{% for choice in question.choice_set.all %}
        <li>{% cycle 'A' 'B' 'C' 'D' 'E' 'F' %}: {{ choice.text }}</li>
    {% endfor %}
mgdq6dx1

mgdq6dx12#

就像A选项01 B选项02等等
这个问题可以通过HTML解决,使用ordered list

<ol type="A">
          {% for choice in question.choice_set.all %}
          <li>{{ choice.text }}</li>
          {% endfor %}
        </ol>

上面将生成一个列表,如

A. choice 01
B. choice 02
...

注意字母标签/前缀后面的圆点(.),如果认为不合适,可以使用CSS样式去掉圆点。

k3fezbri

k3fezbri3#

Django模板提供了一些非常方便的循环内置函数,这里你要使用的是forloop.counter0,具体来说,就是把它作为letters列表的索引。
custom template tag将有助于使其更具可读性:
templatetags/index.py中创建自定义模板标记:

from django import template
register = template.Library()

@register.filter
def index(indexable, i):
    return indexable[I]

导入django模板顶部的自定义模板标签:

{% load index %}

使用模板中的index标记访问counter0循环变量:

{% if question_list %}
<ul>
  {% for question in question_list %}
    <li><a href="#">{{question.question}}</a></li>
      <ul>
        {% for choice in question.choice_set.all %}
        <li>{{ letters|index:forloop.counter0 }}: {{ choice.text }}</li>
        {% endfor %}
      </ul>
  {% endfor %}
</ul>
{% else %}
  <p>No questions available</p>
{% endif %}

建议,将它们“压缩”在一起并将压缩后的输出传递给模板可能是一个更好的主意(您已经在考虑这个问题了--很好!)模板应该尽可能少地了解您的业务逻辑,并尽可能少地假设您的数据结构。

相关问题