向购物车添加项目时,我应该使用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

然后,我在一个"仪表板"页面上呈现_模板,并传递用户对象,然后将创建一个与之组合的购物车。

我还将一些租赁对象传递到一个模板中,在那里它们将被列出,以显示你可以租赁什么,以及它们旁边的一个按钮。

按钮是我遇到的问题。我尝试在Cart类中实现一个函数,将物品添加到租赁中,但事实证明这很困难。。。

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

首先,我的问题是问WTForms是否是最被接受的,WTForms是否应该是我问题的解决方案?我的实现是否过于混乱?

要回答您的主要问题,除了单击按钮外,是否应该使用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

假设您将Rentals迭代为rental,在模板中生成此URL的一种非常方便的方法是:{{url_fo(add_item,item=rent.id(}}

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

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

这将允许您对端点进行POST(也将导航离开页面(。但是由于这个表单没有字段也没有数据,所以你真的不需要WTForms来处理它

最新更新