Получение указанного c ввода из формы, использованной несколько раз на одной странице - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь создать систему корзины, используя flask sql -альхимию. До сих пор у меня есть три модели, хотя большая часть данных в этих методах бесполезна.

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')

В моем файле rout.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>

1 Ответ

1 голос
/ 28 января 2020

Вот несколько вариантов, в зависимости от того, как настроена ваша страница элемента:

  1. Добавьте поле элемента id в форму (не забудьте добавить поле в шаблон):
    class AddToCartForm(FlaskForm):
        item_id = HiddenField()
        submit = SubmitField('Order Now')

, а затем используйте это в вашем обработчике POST, например, для запроса записи по form['item_id']. Этот подход может поддерживать несколько форм на одной странице, если вы отображаете каждую форму с соответствующим идентификатором элемента.

Как и выше, и если вы не используете значение id на странице, вы можете предварительно установить значение id после создания экземпляра формы:
form = AddToCardForm()
form.item_id.data = myitem.id

return render_template(...)
Если каждый элемент находится на отдельной странице, вы можете передать идентификатор в действие формы:

Просмотр:

...
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.
...