代码之家  ›  专栏  ›  技术社区  ›  Alex B

使用Jinja2嵌套For循环迭代连接表中的数据

  •  1
  • Alex B  · 技术社区  · 6 年前

    table 哪个有一个 parent child 按给定“顺序”迭代“项”列表的行。

    “订单”和“项目”列表包含在单独的 tables 当我们使用 query :

    def order_items_template():
        return render_template('order_items_template.html', 
          order_items_query = db.session.query(orders)
          .join(items, orders.id == items.order_id)
          .all())
    

    bootstrap collapsible accordion 显示父/子行。

    {% for order in orders %} 
    
        <tr data-toggle="collapse" data-target="#{{ order.number }}" class="clickable">
            <td>{{ order.number }}</td>        
        </tr>
    
            {% for item in order %}
                <tr class="no-border collapse" id="{{ order.number }}">
                    <td>{{ item.name }}</td>                                          
                </tr>
            {% endfor %} 
    
    {% endfor %}  
    

    此外,我们用一个 sqlalchemy ForeignKey relationship :

    class items (db.Model):
       id = db.Column('id', db.Integer, primary_key = True)
       item = db.Column(db.String(100)) 
       order_id = db.Column(db.Integer)
    
    class orders (db.Model):
       id = db.Column('id', db.Integer, primary_key = True)
       orders = db.Column(db.String(100)) 
       item_id = db.Column(db.Integer, db.ForeignKey('items.order_id'), nullable=False)
       item_relashionship = relationship("items")
    

    虽然 父母亲 行将显示中的数据 rows

    编辑:通过更改“子项” jinja2 loop {{ % for item in order % }} {{ % for item in order.items % }} 如下所示,不返回任何数据,并且 bootstrap accordion 是“破碎”的,不再坍塌。

    出于测试目的,添加 {{ order.item_relashionship.name }} “父循环”的占位符返回 item 匹配 order_id

    items 每人 order . 这一定与这两个表之间的关系有关,但我不知道缺少了什么。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sekar Ramu    6 年前

    当您查询结果并将数据传递到html时,请尝试添加一个带有订单号详细信息的临时列,以便您可以遍历订单并在屏幕上显示它。我以前也遇到过类似的需求,并通过以下方法实现了它。

    queryset1= table1.objects.all().annotate(order=Value('value1', CharField()))
    queryset2= table2.objects.all().annotate(order=Value('value2', CharField()))
    all_items = list(queryset1) + list(queryset2) 
    all_items_feed = sorted(all_items, key=lambda obj: obj.type)
    return render(request, 'page.html', {'all_items_feed' : all_items_feed})
    

    在html页面中,通过检查以下条件来迭代所有的\u项\u提要

    {% if all_items_feed %}
        {% for items in all_items_feed %}
            {% if items.order == 'value1' %}
            populate the html collapse content for every order here
    
        2
  •  0
  •   CodeLikeBeaker    6 年前

    一个简单的猜测,但我认为你需要做一些类似的事情:

    {% for item in order.items %} <-- Note the change in order to order.items
        <tr class="no-border collapse" id="{{ order.number }}">
            <td>{{ item.name}}</td>                                          
        </tr>
    {% endfor %} 
    

    您需要遍历对象 items 为您的子数据