首页 > 解决方案 > Flask 条件渲染

问题描述

我想创建“卡片”,其中包含属于几个类别的某些项目的详细信息,每张卡片都包含一个类别的项目。例如,第一张卡片将包含 CategoryOne 中的所有项目,第二张卡片将包含 CategoryTwo 中的所有项目。我已将项目添加到 sqlite 数据库中。每个类别都有一个名称。每个项目都有

但是,我似乎每张卡都得到相同的物品。也就是说,CategoryOne 中的项目显示在两张卡片中。

标签: pythonhtmlflask

解决方案


从您的代码来看,您似乎希望在运行查询时至少返回 2 个类别 -categories = session.query(Category).order_by(Category.name)

但是当你开始你的循环时,你会在第一次迭代之后返回。在执行此退货之前,您将检索该特定类别的项目。这意味着发送到您的模板的数据包含所有类别,并且仅包含属于其中一个类别的项目。

解决您的问题的一种可能方法(请注意,这只是一个粗略的示例)是创建表单的字典数组 output = [{"category_name": <category_name>, "category_items": <items>}]

然后你遍历你的 html 文件中的输出,比如

<div class="col s12 m12 l12">
  {% for k in output %}
    <div class="card">
      <div class="card-content">
        <div class="d-flex align-items-center">
      <div>
        <h5 class="card-title">{{k.category_name}}</h5>
                        
      .....
       
        <tbody class="white">
          {% for a in k.category_items %}
            <tr>    
              ...
                  <strong>{{a.name}}</strong>
                </p>
                <p>
                  {{a.series}}
                </p>
              ...
          </td>
          <td>
            <div class="blue-grey-text text-darken-4 font-medium flow-text">
              {{a.price}}
            </div>
          </td>
            </tr>
          {% endfor %}  
        </tbody>
      </table>
        </div>
      </div>
    </div>
  {% endfor %}
</div>

更新于 5 月 11 日添加。

你的 python 代码应该是这样的

@app.route('/', methods=['GET', 'POST'])
def showList():
    output =[]
    categories = session.query(Category).order_by(Category.name)
    for c in categories:
        if c.name == 'CategoryOne':
            category_id = 1
        elif c.name == 'CategoryTwo':
            category_id = 2
        
        category = session.query(Category).filter_by(id=category_id)
        items = session.query(Item).filter_by(category_id=category_id).all()
        output.append({"category_name": c.name, "category_items": items})
        
     return render_template('index.html',output=output)
        


推荐阅读