отправка неправильной формы - PullRequest
0 голосов
/ 17 февраля 2020

Я создаю веб-приложение на Flask, и на странице у меня есть несколько форм, когда я нажимаю кнопку отправки для одной формы (называемой «UsedBatch»), она в конечном итоге отправляет его, как будто это другая форма (та, которая называется NewBatch), и я не понимаю, почему. Определения форм показаны ниже:

class NewBatch(FlaskForm):
    quantity = IntegerField('Number of items:', validators=[DataRequired()])
    date = DateField('Date:', default = date.today(), validators=[DataRequired()])
    submit = SubmitField('Submit')

class UsedBatch(FlaskForm):
    quantity = IntegerField('Number of items used:', validators=[DataRequired()])
    date = DateField('Date:', default = date.today(), validators=[DataRequired()])
    used_by = StringField('Used by:')
    submit = SubmitField('Submit')

Прежде чем они пройдут через шаблон, добавляются некоторые атрибуты форм, а затем они определяются, как показано:

for items in items_list:
    setattr(NewBatch, 'item_no', IntegerField(default = items.item_no))
    setattr(UsedBatch, 'item_no', IntegerField(default = items.item_no))
    processed_items_list.append({'item_no':items.item_no, 'quantity':items.quantity, 'items':items.items, 'batch_form':NewBatch(), 'used_form':UsedBatch()})
used_form = UsedBatch()
batch_form = NewBatch()

И наконец, код для форм в шаблоне показан ниже, я перебираю список («процессыd_items_list», показанный выше_, где каждый элемент в списке имеет прикрепленную форму, итерация в этом случае называется items. первая форма ( значение «Используемая партия»:

<form method="POST">
    {{ items['used_form'].date.label }}{{ items['used_form'].date(class="uk-input") }}
    {{ items['used_form'].quantity.label }}{{ items['used_form'].quantity(class="uk-input") }}
    {{ items['used_form'].used_by.label }}{{ items['used_form'].used_by(class="uk-input") }}
    {{ items['used_form'].hidden_tag.label }}{{ items['used_form'].hidden_tag() }}
    {{ items['used_form'].submit() }}
</form>

, а вторая форма (NewBatch):

<form method="POST">
    {{ items['batch_form'].date.label }}{{ items['batch_form'].date(class="uk-input") }}
    {{ items['batch_form'].quantity.label }}{{ items['batch_form'].quantity(class="uk-input") }}
    {{ items['batch_form'].hidden_tag.label }}{{ items['batch_form'].hidden_tag() }}
    {{ items['batch_form'].submit() }}
</form>

Кто-нибудь может понять, почему он отправляет NewBatch поверх UsedBatch? Когда я просто добавляю строки :

if batch_form.validate_on_submit():
    print('Batch submitted')
if used_form.validate_on_submit():
    print('Usage submitted')

При отправке формы UsedBatch возвращается «Отправлено», а не «Использовано отправлено». Кто-нибудь может помочь указать, почему? Спасибо!

1 Ответ

0 голосов
/ 17 февраля 2020

Добавление фильтра к вашему маршруту POST должно исправить это, попробуйте следующее:

if batch_form.submit.data and batch_form.validate(): # notice the order 
    print('Batch submitted')
if used_form.submit.data and used_form.validate(): # notice the order
    print('Usage submitted')

Когда вы вызываете form.validate_on_submit (), он проверяет, отправлена ​​ли форма методом HTTP, независимо от того, кто отправляет кнопка была нажата. Итак, небольшая хитрость выше - просто добавить фильтр (чтобы проверить, есть ли у данных данные, т.е. batch_form.submit.data).

ref: Несколько форм на одной странице, используя flask и WTForms

...