将商品添加到购物车时,我应该对按钮使用WTForms吗?

时间:2018-11-14 02:44:54

标签: python flask flask-sqlalchemy flask-wtforms

所以我正在做一个“租赁应用程序”,在Flask应用程序中有3个类。

下面是我实现的类:

User(作为最高级别的课程)

Cart(每个用户都有购物车)

Rental(用户/购物车的租金可以为“ 0对多”)

cart_with_items = db.Table('cart_with_items',
    db.Column('cart_id', db.Integer, db.ForeignKey('cart.id'), primary_key=True),
    db.Column('rental_id', db.Integer, db.ForeignKey('rental.id'), primary_key=True)
    )


class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))

    cart = db.relationship("Cart", backref='user', lazy=True, uselist=False)


class Cart(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    rentals = db.relationship('Rental', secondary=cart_with_items, lazy='subquery', backref=backref('carts', lazy=True))

@app.route("/dashboard/checkout", methods=['POST'])
def add_item(self,item):
    try:
        this.rentals.append(Rental(1,"2",3.5,"url"))
        return '<h1> it worked</h1>'
    except:
        return '<h1>Didnt work</h1>'



class Rental(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    item_name = db.Column(db.String(15), unique=True);
    item_cost = db.Column(db.Float)
    item_image_url = db.Column(db.String(100))
    #foreign key is a primary key that refers to a key in another table


    def __init__(self,item_id,item_name, item_cost, item_image_url):
        self.id = item_id
        self.item_name = item_name
        self.item_cost = item_cost
        self.item_image_url = item_image_url

    def get_item_id():
        return self.id

    def getItemname():
        return self.item_name

    def getCost():
        return self.item_cost

然后,我在“仪表板”页面上渲染render_template,然后传入用户对象,届时将在其中创建带有组合的购物车。

我还将一些出租对象传递到模板中,在其中将列出它们以显示您可以出租的东西以及旁边的按钮。

该按钮是我遇到的麻烦。我尝试在Cart类中实现一个函数,以将项目添加到租赁中,但是事实证明这很困难...

我不知道我是否能够在jinja2模板中执行onClick(),但我想知道我是否应该仅使用WTForms并尝试将它们想要的项目发布回呈现给定模板的功能?

最重要的是,我的问题是问WTForms是否被最广泛接受,并且WTForms是否可以解决我的问题?我是否对自己的实施太乱了?

1 个答案:

答案 0 :(得分:0)

要回答您的主要问题,除了单击按钮之外,是否应使用WTForms还取决于是否需要收集任何用户输入。 WTForms确实很出色,它从请求主体中提取表单数据,然后将数据强制转换为所需的类型,并在其上运行验证器。如果您没有任何表单字段,则可能不会有太大帮助。

对于Jinja2模板中有关Javascript的问题-是的,您可以将<script> s放在模板中。您可以在模板中放置任何文本,并且它们将完全按原样呈现(当然,除非它是Jinja语句)。因此,您可以将JS直接嵌入模板中,或将其放入.js文件中,并使用<script src=>标签进行链接。

最后,除非您遗漏了某些内容,否则/dashboard/checkout路由处理程序将在运行时崩溃,并显示一条消息,告知其如何期望2个参数,但未提供任何参数。原因是1,自由函数(不在类中的自由函数)没有self参数,而2,路由中没有变量。要获得我认为想要的东西,您需要这样做:

@app.route("/dashboard/checkout/<item>", methods=['POST'])
def add_item(item):

然后,路由处理程序会将<item>中的任何内容作为item参数传递给add_item

假设您将出租作为出租进行迭代,在模板中生成此URL的一种非常方便的方法是:     {{url_for(add_item,item = rental.id)}}

然后,您可以使用此URL进行JavaScript AJAX调用(如果您不想离开页面),也可以将其用作带有提交按钮的表单中的action:< / p>

<form method="POST" action="{{ url_for(add_item, item=rental.id) }}">
<input type="Submit" value="Rent This!">
</form>

这将使您可以对端点进行POST(也可以从页面导航)。但是,由于此表单没有字段也没有数据,因此您实际上不需要WTForms来处理它。