FlaskForm не проверяетPython

Программы на Python
Ответить
Anonymous
 FlaskForm не проверяет

Сообщение Anonymous »

Мне нужна помощь с моим приложением Flask. У меня есть страница с FlaskForm, которая рассчитывает прибыль от продажи продукта. Идея в том, что если страница загружается напрямую или по ссылке, данные для расчетов получаются из базы данных. Но затем пользователь может изменить некоторые значения в FlaskForm и отправить их для получения новых вычислений. И когда страница загружается после отправки формы, часть данных должна быть получена из формы.
Вот мой код для обработки URL-адреса этой страницы:

Код: Выделить всё

@app.route('/ozon-unit-economy', methods=['GET', 'POST'])
def ozonUnitEconomy():
ozonProductId = request.args.get('id')
productData = dict()

form = ozonUnitEcForm()
if form.validate_on_submit():
productData = func.loadOzonProdUEData(form, None, ozonProductId)
calcResults, miscData, currentDate = func.calcOzonUnitEconomy(productData, form.date.data)
else:
productData = func.loadOzonProdUEData(None, None, ozonProductId)
calcResults, miscData, currentDate = func.calcOzonUnitEconomy(productData, date.today())

form.date.data = currentDate
form.price.data = productData['price']
form.salePrice.data = productData['salePrice']
form.purchasePrice.data = productData['purchasePrice']
form.purchaseDiscount.data = productData['purchaseDiscount']
form.factoring.data = productData['factoring']
form.factoringComRate.data = productData['factoringComRate']
form.fastMoney.data = productData['fastMoney']
form.payDelay.data = db.session.execute(
db.select(ozonPayDelay).filter_by(delay=productData['payDelay'])
).scalars().first()
form.crr.data = productData['crr']
form.sellerInst.data = productData['sellerInstComRate']
form.sellerBonusRate.data = productData['sellerBonusRate']
form.fboExp.data = productData['fboExp']
form.fbsExp.data = productData['fbsExp']
form.realFbsExp.data = productData['realFbsExp']
form.fboWarehouseFrom.data = db.session.execute(
db.select(ozonWarehouse).filter_by(id=productData['fboWarehouseFrom'])
).scalars().first()
form.fboWarehouseTo.data = db.session.execute(
db.select(ozonWarehouse).filter_by(id=productData['fboWarehouseTo'])
).scalars().first()
form.fboCrossDockPackage.data = db.session.execute(
db.select(ozonCrossDockingPackage).filter_by(key=productData['fboCrossDockPackageKey'])
).scalars().first()
form.fboTurnover.data = productData['turnoverFbo']
form.fboLocalIndex.data = productData['fboLocalIndex']
form.fbsDropOffCost.data = productData['dropOffCost']
form.realFbsCost.data = productData['realFbsCost']
form.realFbsComp.data = productData['realFbsComp']
form.fboReturnRate.data = productData['returnRateFbo']
form.fbsReturnRate.data = productData['returnRateFbs']
form.realFbsReturnRate.data = productData['returnRateRealFbs']
form.fboReturnExp.data = productData['expReturnFbo']
form.fbsReturnExp.data = productData['expReturnFbs']
form.realFbsReturnExp.data = productData['expReturnRealFbs']

return render_template('ozon-unit-economy.html', title='Юнит-экономика товара Ozon', form=form, productData = productData, miscData = miscData, calcResults = calcResults)
А вот форма:

Код: Выделить всё

class ozonUnitEcForm(FlaskForm):
date = DateField('Дата', validators=[DataRequired()])
price = IntegerField('Цена (р.)', validators=[DataRequired(), NumberRange(min=1)])
salePrice = IntegerField('Цена по акции (р.)', validators=[NumberRange(min=1)])
purchasePrice = DecimalField('Закупочная цена (р.)', validators=[DataRequired(), NumberRange(min=0.01)])
purchaseDiscount = DecimalField('Скидка поставщика (%)', validators=[NumberRange(min=0, max=99.99)])
factoring = BooleanField('Факторинг')
factoringComRate = DecimalField('Комиссия за факторинг (%)', validators=[NumberRange(min=0, max=99.99)])
fastMoney = BooleanField('Гибкий график выплат')
payDelay = QuerySelectField('Отсрочка выплат',
query_factory=lambda: db.session.execute(
db.select(ozonPayDelay)).scalars(),
get_label='delay')
crr = DecimalField('ДРР (%)', validators=[DataRequired(), NumberRange(min=0, max=99.99)])
sellerInst = BooleanField('Рассрочка продавца')
sellerBonusRate = IntegerField('Бонусы продавца (%)', validators=[DataRequired(), NumberRange(min=1)])
fboExp = IntegerField('Стоимость упаковки FBO (р.)', validators=[DataRequired(), NumberRange(min=0)])
fbsExp = IntegerField('Стоимость упаковки FBS (р.)', validators=[DataRequired(), NumberRange(min=0)])
realFbsExp = IntegerField('Стоимость упаковки realFBS (р.)', validators=[DataRequired(), NumberRange(min=0)])
fboWarehouseFrom = QuerySelectField('Склад отправки партии товара',
query_factory=lambda:  db.session.execute(
db.select(ozonWarehouse)).scalars(),
get_label='name')
fboWarehouseTo = QuerySelectField('Склад доставки партии товара',
query_factory=lambda: db.session.execute(
db.select(ozonWarehouse)).scalars(),
get_label='name')
fboCrossDockPackage = QuerySelectField('Упаковка для кросс-докинга',
query_factory=lambda: db.session.execute(
db.select(ozonCrossDockingPackage)).scalars(),
get_label='name')
fboTurnover = IntegerField('Оборачиваемость на складах OZON (дн.)', validators=[DataRequired(), NumberRange(min=0)])
fboLocalIndex = IntegerField('Индекс локализации (%)', validators=[DataRequired(), NumberRange(min=0, max=99)])
fbsDropOffCost = IntegerField('Стоимость обработки отправления FBS (р.)', validators=[DataRequired(), NumberRange(min=0)])
realFbsCost = IntegerField('Стоимость доставки на realFBS (р.)', validators=[DataRequired(), NumberRange(min=0)])
realFbsComp = IntegerField('Компенсация доставки на realFBS (р.)', validators=[DataRequired(), NumberRange(min=0)])
fboReturnRate = DecimalField('Процент возвратов FBO (%)', validators=[DataRequired(), NumberRange(min=0, max=99.99)])
fbsReturnRate = DecimalField('Процент возвратов FBS (%)', validators=[DataRequired(), NumberRange(min=0, max=99.99)])
realFbsReturnRate = DecimalField('Процент возвратов realFBS (%)', validators=[DataRequired(), NumberRange(min=0, max=99.99)])
fboReturnExp = IntegerField('Стоимость обработки возврата FBO (р.)', validators=[DataRequired(), NumberRange(min=0)])
fbsReturnExp = IntegerField('Стоимость обработки возврата FBS (р.)', validators=[DataRequired(), NumberRange(min=0)])
realFbsReturnExp = IntegerField('Стоимость обработки возврата realFBS (р.)', validators=[DataRequired(), NumberRange(min=0)])
submit = SubmitField('Рассчитать')
А вот снимок экрана страницы: страница желает FlaskForm
Моя идея состоит в том, что если форма проверяется при отправке, то форма передается в функция loadOzonProdUEData для получения части необходимых данных из формы. А если это не форма, она не передается, а затем функция loadOzonProdUEData загружает все данные из базы данных.
Проблема в том, что форма никогда не проверяется при отправке, и я не знаю, почему. Также я думаю, что это может быть не очень хорошая идея, потому что, когда форма не проверяется в случае, если с ней что-то не так, расчет все равно будет обрабатываться с использованием базы данных формы данных, но в этом случае лучше получить сообщение об ошибке, чтобы исправить то, что не так. .
Пожалуйста, посоветуйте, как лучше сделать то, что мне нужно.

Подробнее здесь: https://stackoverflow.com/questions/791 ... t-validate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»