Django:在模板

时间:2018-02-15 15:12:09

标签: 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 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_name(obj A) - property_value(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>

桌子空了。没有错误,没有日志,服务器工作正常。如果我只是执行for循环的{{objects_list}} ,我会在HTML中获得“zip object at”。所以我知道有些东西。我似乎并没有正确解压缩它,因为如果我在for循环中{{objects_list}} 内部,那么就不会显示任何内容。

有什么想法吗?我非常感谢这方面的任何帮助。作为一名大三学生,我已经四处寻找并且我看到有些人为类似的情况覆盖了“get_context_data”,但我不知道该怎么做,或者它是否适用于这种情况。

1 个答案:

答案 0 :(得分:1)

因此,在python 2.7中,zip看起来像是立即返回一个元组列表。在python 3中(我猜你正在使用),zip将返回zip类。

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

Django的模板语言可能不知道如何处理它,即使尝试迭代它也会失败。 Django的模板语言在遇到类似问题的时候也非常安静,几乎有时会出现IMO错误。

转换它的方式比我在上面的评论中所提供的理解更简单的方法是将其包裹在list()调用中:

objects_list = list(zip(chamber_properties, chambers_list))