代码之家  ›  专栏  ›  技术社区  ›  Mormoran

Django:在模板中的同一循环中循环2个对象

  •  3
  • Mormoran  · 技术社区  · 7 年前

    我有两个相关的模型,我需要创建一个从这两个对象中获取的表。

    在我的机型中:

    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)
    

    结构很奇怪,但现在只向腔室模型添加属性和值已经太迟了。我不得不接受这样一个事实,即它们是两个独立的模型。

    在我的表格中,我需要以下结构:

    chamber\u name(obj A)-property\u value(obj B)-customer(再次为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>
    

    桌子空了。没有错误,没有日志,服务器工作正常。如果我只做{{objects\u list}} 外部 在for循环中,我在HTML中得到了“zip object at”。所以我知道 某物 有。我似乎没有正确地解包,因为如果我执行{{objects\u list}}} 在…内 对于for循环,再次没有显示任何内容。

    有什么想法吗?如果能在这件事上得到任何帮助,我将不胜感激。作为一名大三学生,我到处搜索,看到一些人在类似的情况下覆盖“get\u context\u data”,但我还不知道如何做到这一点,也不知道它是否适用于这种情况。

    1 回复  |  直到 7 年前
        1
  •  1
  •   wholevinski    7 年前

    因此,在python 2.7中 zip 立即返回元组列表。在python 3中(我猜您正在使用它), 拉链 将返回 拉链

    print(zip([1,2,3],[4,5,6]).__class__)
    <class 'zip'>
    

    Django的模板语言可能不知道该怎么做,它甚至尝试迭代都会退出。Django的模板语言在遇到这样的问题时也非常安静,几乎有时会出现错误。

    与我在上面的评论中所表达的理解相比,转换它的一个更简单的方法是用 list() 电话:

    objects_list = list(zip(chamber_properties, chambers_list))