所以我正在做一个“租赁应用程序”,在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是否可以解决我的问题?我是否对自己的实施太乱了?
答案 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来处理它。