从django模板中的列表中选择特定对象

时间:2017-09-28 18:44:14

标签: python django django-forms

我正在使用formset_facotry,我正在尝试解决问题。

我有一个从views.py文件中的查询集返回的用户列表。我还有一个表单列表,这些表单是根据列表查询返回的对象数创建的。我想要发生的是它选择返回的第一个对象并在第一个要显示的表单之前显示它。然后抓住第二个对象并在第二个表单之前显示,依此类推......背后的一般想法是跟进:

我希望它能像这个通用模板那样做:

header = 'Add record' + groupName
if message:
    print(message)
count = 0
for f in form:
    expenses[0]
    f.as_p
    count = count + 1

我想根据循环中的计数获取特定项目:

以下是我在模板中的代码:

{% extends "base.html" %}

{% block content %}
  <h2>Add expense - {{ currentGroup.name }}</h2>
  {% if message %}
    <p>{{message}}</p>
  {% endif %}
  <form action="." method="POST">
    {% csrf_token %}
    {{ form.management_form }}
    {% with count=0 %}
      {% for f in form %}
        {% for expense in expenses %}
          <p>{{ expense.user.username }}</p>
        {% endfor %}
        {{ f.as_p }}
      {% endfor %}
    {% endwith %}
    <input type="submit" name="submit" value="submit">
  </form>
{% endblock %}

有人可以帮我弄清楚如何在html模板中的对象集中迭代和指定某个对象

3 个答案:

答案 0 :(得分:1)

我认为下面的代码适用于模板循环

{% for f in form %}
   {% for expense in expenses %}
       {% if forloop.parentloop.counter == forloop.counter %}
          <p>{{ expense.user.username }}</p>
       {% endif %}
   {% endfor %}
   {{ f.as_p }}
{% endfor %}

答案 1 :(得分:0)

您可以访问基于1的计数器forloop.counter

{% for expense in expenses %}
  {% if forloop.counter == 25 %}  # this is the 25th, not 26th item
      do stuff
  {% endif %}
{% endfor %}

答案 2 :(得分:0)

听起来你正在寻找python's zip() function,它会加入两个列表,让你一起迭代它们。您需要在视图中将列表压缩在一起,然后您可以遍历模板中的新列表。

在视图中:

forms_and_users = zip(forms_list, users_list)
# Add forms_and_users to template context

在模板中

{% for form, user in forms_and_users %}
    {{ user }}
    {{ form }}
{% endfor %}