Python 在django模板中迭代列表两次

Python 在django模板中迭代列表两次,python,django,django-templates,Python,Django,Django Templates,在django模板中,我创建了两个选项卡-“所有事件”和“您的事件”。在第一个选项卡中,我希望列出所有事件,在第二个选项卡中,我希望有一个经过筛选的事件列表(用户正在参与的事件) 为此,我在同一个列表上循环了两次。第一次迭代很好,但第二次迭代没有给出任何输出。我怎样才能修好它 在下面发布我的html模板 {% block content%} <ul class="nav nav-tabs" style="padding-top: 60px"> <li class="act

在django模板中,我创建了两个选项卡-“所有事件”和“您的事件”。在第一个选项卡中,我希望列出所有事件,在第二个选项卡中,我希望有一个经过筛选的事件列表(用户正在参与的事件)

为此,我在同一个列表上循环了两次。第一次迭代很好,但第二次迭代没有给出任何输出。我怎样才能修好它

在下面发布我的html模板

{% block content%}

<ul class="nav nav-tabs" style="padding-top: 60px">
  <li class="active"><a data-toggle="tab" href="#allevents">All events</a></li>
  <li class=""><a data-toggle="tab" href="#yourevents">Your events</a></li>
</ul>

<div class="container-fluid">
    <h1>Event list</h1>
</div>

<div class="tab-content">
    <div id="allevents" class="tab-pane fade in active">
    {% for event, is_att in event_zip %}

    <p> {{ event.name }} </p>
    DISPLAY ALL EVENTS HERE - displays correctly

    {% endfor %}
    </div>

    <div id="yourevents" class="tab-pane fade">
    {% for event, is_att in event_zip %}

    <!-- {% if is_att %} --> 
    <p> {{ event.name }} </p>
     DISPLAY FILTERED EVENTS HERE - doesn't give any output
     Does not work even with 'if' statement commented out.
    <!-- {% endif %} -->

    {% endfor %}
    </div>


</div>

{% endblock %}
事件模型

class Event(models.Model):
    name = models.CharField(max_length=50, blank=False, unique=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateTimeField(blank=False)
    place = models.CharField(max_length=50, blank=False)
    list_of_users = models.ManyToManyField(User, related_name='user_list', blank=True)

    @property
    def is_in_future(self):
        return self.date > timezone.now()

    def __str__(self):
        return self.name
您仅在第二个循环中注释掉“if is_att”。而不是:

<!-- {% if is_att %} --> 

if语句仍然在django模板中使用,您使用的是python3,其中
zip
是一个生成器;生成器只能迭代一次

您可以通过显式调用
list
来解决此问题:

event_zip = list(zip(event_list, is_att))
但实际上,这已经是一件非常低效的事情。对于每个事件,您都会请求所有关联的用户,然后测试当前用户是否在该列表中。相反,您只需执行一个单独的查询即可获得与用户关联的所有事件:

 user_events = Event.objects.filter(list_of_users=user)
并将该对象分别传递给模板


(注意,此查询也可以拼写为
user\u events=user.user\u list.all()
-这是不必要的混淆,因为您在事件模型上使用了一个错误命名的
相关\u名称
。该名称应为
事件\u列表
,因为它为您提供了一个与该用户相关的事件列表;或者,只需将该参数全部删除,即可获得默认值,
事件集

什么是
的值是_att
?将isat设置为列表而不是迭代器请显示视图。什么是
事件\u zip
?是\u att是一个布尔列表,如果用户加入了事件,则为True,如果用户未添加视图和模型,则为False实际上我的代码中没有这些行,只是将其添加到此处以显示我要对其进行筛选。{%for event,is_att in event_zip%}在第二次调用时不提供任何输出
event_zip = list(zip(event_list, is_att))
 user_events = Event.objects.filter(list_of_users=user)