Python Django:在模板中的同一循环中循环2个对象
我有两个相关的模型,我需要创建一个从这两个对象中获取数据的表 在我的模型中:Python Django:在模板中的同一循环中循环2个对象,python,django,django-templates,django-views,Python,Django,Django Templates,Django Views,我有两个相关的模型,我需要创建一个从这两个对象中获取数据的表 在我的模型中: class Chamber(models.Model): chamber_name = models.CharField(max_length=100) chamber_type = models.CharField(max_length=50) customer = models.ForeignKey(Customer, on_delete=models.CASCADE) class Cha
class Chamber(models.Model):
chamber_name = models.CharField(max_length=100)
chamber_type = models.CharField(max_length=50)
customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
class ChamberProperties(models.Model):
chamber = models.ForeignKey(Chamber, on_delete=models.CASCADE)
property_name = models.CharField(max_length=20)
property_value = models.CharField(max_length=100)
结构很奇怪,但现在只向腔室模型添加属性和值已经太迟了。我不得不接受这样一个事实:它们是两个不同的模型
在我的表格中,我需要以下结构:
商会名称(obj A)-财产价值(obj B)-客户(再次为obj A)
我尝试了压缩列表,但似乎无法将其解压缩:
class ChambersView(generic.DetailView):
template_name = 'pages/chambers.html'
def get(self, request):
user = User.objects.get(username=request.user)
customer = Customer.objects.get(user=user)
chambers_list = list(Chamber.objects.filter(customer=customer))
chamber_properties = list(ChamberProperties.objects.filter(chamber__in=chambers_list).order_by('id'))
objects_list = zip(chamber_properties, chambers_list)
form = ChambersFilterForm(request=request)
return render(request, self.template_name, {'filter_form':form, 'objects_list': objects_list})
如果我用python解包,它会工作:
for properties, chambers in objects_list:
print("-----------------------------------------------------------")
print("Property is: ", properties.property_value, "and the chamber is:", chambers.chamber_name)
print("-----------------------------------------------------------")
但当我转到我的HTML模板时:
<div class="card-body p-1">
<table class="table table-hover">
<tr class="table-active">
<th>Chamber</th>
<th>Property Value</th>
<th>Customer</th>
</tr>
{% for properties, chambers in objects_list %}
<tr>
<td><a href="{% url 'chamber' chamber.id %}">{{chambers.chamber_name}}</a></td>
<td><a href="{% url 'chamber' chamber.id %}">{{properties.property_value}}</a></td>
<td><a href="{% url 'chamber' chamber.id %}">{{chambers.customer}}</a></td>
</tr>
{% endfor %}
</table>
</div>
室
财产价值
顾客
{%用于属性,对象中的分庭\u列表%}
{%endfor%}
桌子空了。没有错误,没有日志,服务器工作正常。如果我只在for循环的{{objects\u list}}外部执行,我会在HTML中得到“zip object at”。所以我知道那里有什么东西。我只是似乎没有正确地解包它,因为如果我在for循环中执行{{objects_list}},同样也不会显示任何内容
有什么想法吗?我将非常感谢在这件事上的任何帮助。作为一名大三学生,我四处搜索过,我看到一些人在类似的情况下重写“get_context_data”,但我不知道如何做,也不知道它是否适用于这种情况。因此,在Python2.7中,它看起来像是
zip
立即返回元组列表。在Python3(我猜您正在使用)中,zip
将返回一个zip
类
print(zip([1,2,3],[4,5,6]).__class__)
<class 'zip'>
一切看起来都很好…你能试一下你的观点吗?压缩后,您可以这样做:
objects\u list=[(props,chambers)for props,chambers in objects\u list]
没有说这是正确的方法,只是好奇这是否会改变任何东西。@wholevinski这工作得很好。但我不明白那一行代码。你能详细说明一下吗?嗯,我不是100%确定这为什么有效。这行代码是一个列表理解,它将压缩后的列表解压成元组。你关于它显示为“zip object at”的线索让我相信django模板可能不会将其视为一个iterable之类的东西。对列表的理解迫使它在设置上下文之前成为一个列表。我想我找到了它。我将在下面发布一个答案。非常感谢你详细的回答,它帮助了我很多,也帮了我一些挫折感(我已经有很多了!)。是的,Python 3.5.3,Django 11.8。
objects_list = list(zip(chamber_properties, chambers_list))