(Flask)为什么我的 HTML 中的 Jinja 块没有获取从 SQLAlchemy 查询传递的所有 table 条目?

(Flask) Why doesn't the Jinja block in my HTML get all the table entries passed from a SQLAlchemy query?

我正在尝试发送 table 个条目以显示在 HTML 上使用 Jinja 通过从具有特定约束的路由函数返回的 SQLAlchemy 查询结果(第二段)但只有一个条目这使它成为 Jinja 代码。

此处的目标是显示给定产品的信息及其包含的订单(即使该订单中除给定产品外还有其他产品)。

实际上,所有这些信息都正确显示在 HTML table 中,但为了便于阅读,我删除了它们的代码。

@app.route('/<int:product_id>/product_details', methods=['GET'])
def product_details(product_id):
    order_list = Order.query.all()
    product = Products.query.filter_by(product_id=product_id).first()
    for order_to_process in order_list:
        product_list = order_to_process.product_list.split("\n")
        for prod in product_list [:-1]:
            prod_info = prod.split(":")
            if product_id == int(prod_info[0]):
                orders = Order.query.filter_by(product_list=order_to_process.product_list)
    if order_list:
        return render_template('/product_details.html', product=product, orders=orders)
    else:
        return render_template('/product_details.html', product=product)
{% for order in orders %}
   {{order.order_id}}
   {{order.client_id}}
   {{order.order_date}}
   {{order.order_address}}
   {% set product_list = order.product_list.split("\n") %}
   {% for prod in product_list[:-1] %}
      {% set prod_info = prod.split(":") %}
      {{prod_info[0]}}
      {{prod_info[1]}}
      {{prod_info[2]}}
   {% endfor %}
   {{order.total_price}}
   {{order.paiment_method}}
   {{order.status}}
{% endfor %}

产品table型号:

Product
   product_id: int
   product_name: string
   product_description: string
   product_price: float
   product_quantity: int
   product_category: string
   product_image_url: string

订单table型号:

Order
   order_id: int
   client_id: int
   order_date: string
   order_address: string
   product_list: string
   total_price: float
   paiment_method: string
   status: string

"product_list" 格式如下:

"product_id:product_name:quantity\n"

“数量”经过计算,与产品中存在的数量不同 table

编辑: 更正了拼写错误:“liste_prods”到“product_list”(变量和东西最初是用法语命名的,我为这个问题翻译了它,但忘记了那个)

在每个循环周期中,您都将覆盖之前的 orders 变量。您需要将查询结果添加到列表中。

@app.route('/<int:product_id>/product_details', methods=['GET'])
def product_details(product_id):
    orders = []
    order_list = Order.query.all()
    product = Products.query.filter_by(product_id=product_id).first()
    for order_to_process in order_list:
        product_list = order_to_process.product_list.split("\n")
        for prod in liste_prods[:-1]:
            prod_info = prod.split(":")
            if product_id == int(prod_info[0]):
                orders.extend(Order.query.filter_by(liste_product=order_to_process.product_list))
    if order_list:
        return render_template('/product_details.html', product=product, orders=orders)
    else:
        return render_template('/product_details.html', product=product)

'liste_prods'从何而来? 也许你可以试试这个:

product = Products.query.get(product_id)
return render_template('/product_details.html', product=product)

在订单中使用{{product.orders}} html

最终解决方案:

@app.route('/<int:product_id>/product_details', methods=['GET'])
def product_details(product_id):
    orders = []
    order_list = Order.query.all()
    product = Products.query.filter_by(product_id=product_id).first()
    for order_to_process in order_list:
        product_list = order_to_process.product_list.split("\n")
        for prod in product_list [:-1]:
            prod_info = prod.split(":")
            if product_id == int(prod_info[0]):
                orders_var = Order.query.filter_by(product_list=order_to_process.product_list)
                for order_var in orders_var:
                    if order_var not in orders:
                        orders.extend(Order.query.filter_by(product_list=order_to_process.product_list))
    if len(orders) > 0:
        return render_template('/product_details.html', product=product, orders=orders)
    else:
        return render_template('/product_details.html', product=product)