【问题标题】:How to iterate over 2 variables in Django template如何在 Django 模板中迭代 2 个变量
【发布时间】:2023-01-11 19:12:22
【问题描述】:

我有一个应用程序可以进行一些带有问题和选择的测验。 所以我试图将所有这些东西呈现给 Django 模板。 在我的 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 %} 

所以在这里,我将讨论与这个问题相关的所有问题和所有选择。但是我不知道我怎么也可以浏览字母列表?我正在考虑全部压缩。但鉴于我只有问题没有选择,所以我无法解决。

那么这里还有什么可能呢?

【问题讨论】:

  • 你能解释一下你想在哪里/如何浏览 letters 列表吗?比如,那应该是嵌套循环(可能)还是第一个循环之后的循环(也可能)?
  • 是的,字母应该在第二个嵌套循环中,在这一行 - <li>{{ choice.text }}</li> 所以它就像 A choice01,B choice 02 等等

标签: python django django-templates


【解决方案1】:

所以它会像 A choice01, B choice 02 等等

这可以通过 HTML 来解决。使用ordered list

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

【讨论】:

  • 我的看法是这些字母有一定的意义(可能与答案等相关)。此外,如今浏览器中的 OL 通常默认为数字,因此需要一些额外的样式。
  • @Oerd 不知道这些字母是否有意义。 type="A" -> 列表项将以大写字母标记/前缀。
【解决方案2】:

Django 模板使一些非常方便的 loop builtins 可用。在这种情况下,您要使用的是forloop.counter0。具体来说,将其用作您的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>{{ letters[forloop.counter0] }}: {{ choice.text }}</li>
        {% endfor %}
      </ul>
  {% endfor %}
</ul>
{% else %}
  <p>No questions available</p>
{% endif %} 

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      相关资源
      最近更新 更多