首页 > 解决方案 > 从一个页面上多次使用的表单获取特定输入

问题描述

我正在尝试使用烧瓶 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>

标签: pythonflaskjinja2flask-sqlalchemy

解决方案


以下是一些选项,具体取决于您的项目页面当前的设置方式:

  1. 将 itemid字段添加到表单中(不要忘记将字段添加到模板中):
    class AddToCartForm(FlaskForm):
        item_id = HiddenField()
        submit = SubmitField('Order Now')

然后在您的 POST 处理程序中使用它来查询记录form['item_id'],例如。如果您使用各自的项目 ID 呈现每个表单,则此方法可能支持在同一页面上具有多个表单。

  1. 和上面类似,如果你没有在页面上使用 id 值,你可以在实例化表单后预设 id 的值:
form = AddToCardForm()
form.item_id.data = myitem.id

return render_template(...)
  1. 如果每个项目都在它自己的页面上,您可以将 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.

推荐阅读