python - 从一个页面上多次使用的表单获取特定输入
问题描述
我正在尝试使用烧瓶 sql-alchemy 创建一个购物车系统。到目前为止,我已经得到了三个模型,尽管这些方法中的很多数据都是无用的。
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(30), unique=True, nullable=False)
join_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
password = db.Column(db.String(60), nullable=False)
admin = db.Column(db.Boolean, nullable=False, default=False)
messages = db.relationship('Message', backref='sender', lazy=True)
cart = db.relationship('Cart', backref=db.backref('shopper', lazy=True, uselist=False))
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
category = db.Column(db.String)
title = db.Column(db.String)
location = db.Column(db.String)
price = db.Column(db.Integer)
allocation = db.Column(db.Integer)
ram = db.Column(db.Integer)
storage = db.Column(db.Integer)
players = db.Column(db.String)
inCarts = db.relationship('Cart', secondary=association_table, backref=db.backref('cartItem', lazy='dynamic'))
class Cart(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
我有一个 addtocart 表单,它只是一个按钮,
class AddToCartForm(FlaskForm):
submit = SubmitField('Order Now')
在我的 routes.py 文件中,我设置了变量 form=AddToCartForm() 并检查它在提交时是否有效。我有多个使用此表单的项目,所以我的问题是如何检查正在提交的项目。
这是html
<div class="server-option">
<h5>{{ item.title }} [ {{ item.location }} ]</h5>
<p style="display: inline; float: right;">Starting at ${{ item.price }} USD Monthly</p>
<div class="server-specs">
<p><small><span style="font-weight: bold;">CPU Allocation - </span>{{ item.allocation }}%</small></p>
<p><small><span style="font-weight: bold;">RAM - </span>{{ item.ram }}GB</small></p>
<p><small><span style="font-weight: bold;">Storage - </span> {{ item.storage }}GB {{ storage_type }}</small></p>
<p><small><span style="font-weight: bold;">Players - </span>{{ item.players }}</small></p>
</div>
<form method="POST" action="">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.submit(class="add-to-cart") }}
<!-- ! Seperate item page for each item therefore you can use the link information to tell which item to add -->
</div>
</form>
</div>
解决方案
以下是一些选项,具体取决于您的项目页面当前的设置方式:
- 将 item
id
字段添加到表单中(不要忘记将字段添加到模板中):
class AddToCartForm(FlaskForm):
item_id = HiddenField()
submit = SubmitField('Order Now')
然后在您的 POST 处理程序中使用它来查询记录form['item_id']
,例如。如果您使用各自的项目 ID 呈现每个表单,则此方法可能支持在同一页面上具有多个表单。
- 和上面类似,如果你没有在页面上使用 id 值,你可以在实例化表单后预设 id 的值:
form = AddToCardForm()
form.item_id.data = myitem.id
return render_template(...)
- 如果每个项目都在它自己的页面上,您可以将 Id 传递给表单操作:
看法:
...
item_id = my_item.id
form = AddToCartForm()
return render_template('template.html', item_id=item_id, form=form)
模板:
...
<form action="{{url_for('your_post_view', id=item_id)}}" ...
最后,您的 POST 处理程序视图:
@app.route('/url/<id>')
def post_view(id):
# Query using id etc.
推荐阅读
- php - Laravel 显示子类别
- asp.net-core - TFS 2018 构建失败,Core 2.1 和 Microsoft.Windows.Compatibility 2.0.1
- ruby-on-rails - 用于构建消息的 RSpec 创建方法
- python - 在python中对字符串值进行排序
- javascript - 从其他函数创建一个函数,但使用预填充的参数
- leaflet - 无法执行坐标的投影变换,用于 Leaflet
- python - ValueError:尝试对测试集进行预测时尺寸不匹配
- jenkins - 在jenkins groovy中调用变量的最佳方法
- ms-access-2010 - Ms Access 和 SQL Server nvarchar(max) 限制为 4000 个字符
- python - 为特定版本的 Python 编译 Python 模块