Python 在django模板中迭代列表两次
在django模板中,我创建了两个选项卡-“所有事件”和“您的事件”。在第一个选项卡中,我希望列出所有事件,在第二个选项卡中,我希望有一个经过筛选的事件列表(用户正在参与的事件) 为此,我在同一个列表上循环了两次。第一次迭代很好,但第二次迭代没有给出任何输出。我怎样才能修好它 在下面发布我的html模板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
{% 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)