0

我试图在我的简单服装电子商务网站中尽量减少路线和数据库表的数量。我的网站有四个产品类别:外套、衬衫、裤子、鞋。

每个类别目前在数据库中都有自己的表:

class Coat(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text, nullable=False)
description = db.Column(db.Text, nullable=True)
price = db.Column(db.Float)
image1 = db.Column(db.String(100), nullable=True, default='default.jpg')
image2 = db.Column(db.String(100), nullable=True)

我想将所有产品组合到一个数据库中,其中“类别”是该产品数据库中的一列。

每个类别目前也有自己的路线和模板:

@app.route('/coats')
def coats():
products = Coat.query.all()
return render_template('coats.html', products=products, title='Coats')

{% extends "base.html" %}
{% block content %}
    {% for product in products %}
        <div class="product">
            <a href="{{ url_for('product_coat', id=product.id) }}">
            <img src="static/images/coats/{{ product.image1 }}" class="image"></a>
            <p class="name">{{ product.name }}</p>
            <p class="price">{{ product.price }}</p>
        </div>
    {% endfor %}
{% endblock %}

当点击产品链接时,会显示一个产品页面,再次为每个类别使用单独的路线:

@app.route('/product_coat/<id>', methods=['GET', 'POST'])
def product_coat(id):
product = Coat.query.get(id)
return render_template('product_coat.html', title='Product', 
    product=product)

目前我在“base.html”中的导航栏看起来像这样:

<nav>
    <a href="{{ url_for('coats') }}"><h3>Coats</h3></a>
    <a href="{{ url_for('shirts') }}"><h3>Shirts</h3></a>
    <a href="{{ url_for('trousers') }}"><h3>Trousers</h3></a>
    <a href="{{ url_for('shoes') }}"><h3>Shoes</h3></a>
</nav>

我意识到这是一个相当大的帖子,所以总结一下,

如果我要将所有四个数据库表合并到一个带有新“类别”列的产品表中,我将如何

  1. 为这些类别创建导航栏链接?
  2. 创建一个处理仅显示所选类别的产品的路线?

谢谢阅读。

4

2 回答 2

0

您可以将查询参数传递给新路由,

@app.route('/product/', methods=['GET'])
def product_list(id):
  item = request.args.get('item')
  product = products.all.filter(type=item)
  return render_template(f"{item}.html", title=item,product=product)

然后当您加载页面时,您可以调用url/?item=coat它会过滤数据。

*该产品过滤线可能不正确。

于 2020-12-24T14:09:58.950 回答
0

您可以做的是尝试遵循更RESTful 的设计模式

主要思想是在你的路由中添加一个参数来表示category. 这与您为产品 ID 所做的类似。重要的是,您将只有一个用于产品页面的HTML 模板(列出特定类别的所有产品的页面)和一个用于产品页面的HTML 模板(用于列出特定类别的一种产品的详细信息的页面)。

所以你现有的两条路线可能会变成这样:

(请注意,您的逻辑应确保正确处理无效的产品类别和/或 ID)

@app.route('/products/<product_category>/<product_id>', methods=['GET', 'POST'])
def product(product_category, product_id):
    product = <your database logic utilizing the product_category and product_id + error handling>
    return render_template('product.html', product=product, title=product.name)

@app.route('/products/<product_category>', methods=['GET'])
def products(product_category):
    products = <your database logic utilizing the product_category + error handling>
    return render_template('products.html', products=products, title=product_category.title())

您的导航栏 HTML 最终可能如下所示:

(这里我们指定第二条路线并仅提供类别)

  <nav>
    <a href="{{ url_for('products', product_category='coats') }}"><h3>Coats</h3></a>
    <a href="{{ url_for('products', product_category='shirts') }}"><h3>Shirts</h3></a>
    <a href="{{ url_for('products', product_category='trousers') }}"><h3>Trousers</h3></a>
    <a href="{{ url_for('products', product_category='shoes') }}"><h3>Shoes</h3></a>
  </nav>

最后,您的产品展示 HTML 可能会像这样结束:

(这里我们指定第一条路线并提供类别和产品 ID——因为在这种情况下我们链接到特定产品)

<div class="product">
  <a href="{{ url_for('product', product_category=product.category, product_id=product.id) }}">
  <img src="{{ url_for('static', filename='images/coats/' + product.image1) }} class="image"></a>
  <p class="name">{{ product.name }}</p>
  <p class="price">{{ product.price }}</p>
</div>

另外,我建议研究一下在 Flask 应用程序中非常流行的MVC 设计模式。

于 2020-12-24T14:58:50.830 回答