我有 3 個欄位,我想比較“來自”欄位和“到”欄位的薪水,并且還有固定薪水欄位。我不知道該怎么做,因為沒有檔案可以做到這一點,所以我創建了相互查看的自定義函式并嘗試確定它們是否有價值。
def validate_salarylow(self, salarylow):
if self.validate_salary_fixed(self.salary_fixed) != "":
salarylow.data = int(0)
else:
try:
salarylow.data = int(salarylow.data)
except:
raise ValidationError("value is not a number")
return salarylow.data
def validate_salary_high(self, salary_high):
if self.validate_salary_fixed(self.salary_fixed) != "":
salary_high.data = int(0)
else:
try:
salary_high.data = int(salary_high.data)
except:
raise ValidationError("value is not a number")
return salary_high.data
def validate_salary_fixed(self, salary_fixed):
if self.validate_salary_high(self.salary_high) != "":
salary_fixed.data = int(0)
try:
salary_fixed.data = int(salary_fixed.data)
except:
raise ValidationError("value is not a number")
return salary_fixed.data
如果我不設定if self.validate_salary_high(self.salary_high) != "":一切正常。但是當我設定它時,我得到“RecursionError:超出最大遞回深度”error.validate_salary_fixed 函式看起來是 validate_salary_high 函式,反之亦然。我是 Python 和燒瓶的新手,我確信有簡單的解決方案,但我找不到它,所以如果有人能提供幫助,我將不勝感激。
uj5u.com熱心網友回復:
我的建議是通過覆寫它來抑制整數欄位的錯誤訊息。因此,不必轉換輸入的型別。
對于驗證,我使用了兩個自定義驗證器,其中一個檢查是否輸入了范圍或固定值,第二個檢查范圍的限制。此外,預先構建的驗證器用于禁止負值。
我不確定您是否真的需要固定薪水的欄位,因為可以通過縮小范圍來定義固定值。
from flask_wtf import FlaskForm
from wtforms import IntegerField
from wtforms.validators import (
NumberRange,
Optional,
StopValidation,
ValidationError
)
class OptionalIntegerField(IntegerField):
def process_data(self, value):
try:
super().process_data(value)
except ValueError:
pass
def process_formdata(self, valuelist):
try:
super().process_formdata(valuelist)
except ValueError:
pass
def validate_salary(form, field):
range_fields = [form.salary_low, form.salary_high]
if all(f.data is None for f in [form.salary_low, form.salary_high, form.salary_fixed]) or \
(form.salary_fixed.data is not None and any(f.data is not None for f in range_fields)) or \
(form.salary_fixed.data is None and any(f.data is None for f in range_fields)):
raise StopValidation('Either state a range from low to high or a fixed salary.')
def validate_salary_range(form, field):
if form.salary_low.data and form.salary_high.data and \
form.salary_low.data > form.salary_high.data:
raise ValidationError('The lower value should be less than or equal to the higher one.')
class SalaryForm(FlaskForm):
salary_low = OptionalIntegerField(
validators=[
validate_salary,
validate_salary_range,
Optional(),
NumberRange(min=0)
]
)
salary_high = OptionalIntegerField(
validators=[
validate_salary,
validate_salary_range,
Optional(),
NumberRange(min=0)
]
)
salary_fixed = OptionalIntegerField(
validators=[
validate_salary,
Optional(),
NumberRange(min=0)
]
)
app = Flask(__name__)
app.secret_key = 'your secret here'
@app.route('/', methods=['GET', 'POST'])
def index():
form = SalaryForm(request.form)
if form.validate_on_submit():
print(form.salary_low.data, ' - ', form.salary_high.data, '||', form.salary_fixed.data)
return render_template('index.html', **locals())
uj5u.com熱心網友回復:
讓我們看一下您的代碼:
- 您的函式
validate_salary_high呼叫validate_salary_fixed. - 但是當你去你的函式
validate_salary_fixed時,它會呼叫validate_salary_high. - 所以你回到你
validate_salary_high呼叫的函式validate_salary_fixed。 - 現在在你的函式
validate_salary_fixed中,你呼叫validate_salary_high.
你的函式一次又一次地相互呼叫,直到你的計算機最終拋出一個錯誤——這正是發生在你身上的事情。
解決此問題的方法是洗掉您的一個遞回呼叫。更具體地說,您應該
validate_salary_fixed在函式中洗掉您的呼叫validate_salary_high- 或洗掉您
validate_salary_high在函式中的呼叫validate_salary_fixed
您應該根據代碼的目標(我不完全理解)選擇要洗掉的函式呼叫。祝你好運!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496337.html
