我def validate(self)在RegistrationForm(FlaskForm). 如果汽車續航里程超過 400 公里,第一個功能會驗證用戶輸入。另一個函式通過 geopy 模塊計算用戶地址和作業地址之間的距離來驗證用戶是住在離作業地點遠還是近。我被告知該def validate_field(self, field):函式只需要一個屬性,該屬性必須與欄位名稱相同。在那個函式中,我有一個額外的變數total_travel_km來存盤作業和用戶家之間的距離。如果用戶經過驗證,我需要將total_travel_km變數存盤在資料庫中。
現在服務器給我帶來了這條訊息:“RegistrationForm”物件沒有屬性“total_travel_km”
如何total_travel_km正確呼叫該變數并將其寫入 DB
這是我的代碼中的刪減:
class RegistrationForm(FlaskForm):
car_range = IntegerField('Car Range, km')
home_address = StringField('Home Address')
submit = SubmitField('Register User/Car')
def validate_car_range(self, car_range):
if car_range.data > 400:
raise ValidationError('Your car range does not meet our requirements')
def validate_home_address(self, home_address):
user_loc = locator.geocode(home_address.data)
user_coords = (user_loc.latitude, user_loc.longitude)
one_way = geopy.distance.geodesic(tco_coords, user_coords).km
total_travel_km = one_way*4
if total_travel_km < self.car_range.data:
raise ValidationError('You live too close to work')
return total_travel_km
@app.route("/register", methods=['POST', 'GET'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(car_range=form.car_range.data, home_address=form.home_address.data,
car_travel_km=form.total_travel_km)
db.session.add(user)
db.session.commit()
編輯:我想通了。我必須通過表格。而不是自己。在驗證方法中。下面是正確的代碼:
def validate_home_address(form, home_address):
user_loc = locator.geocode(home_address.data)
user_coords = (user_loc.latitude, user_loc.longitude)
one_way = geopy.distance.geodesic(tco_coords, user_coords).km
form.total_travel_km = one_way*4
if form.total_travel_km < self.car_range.data:
raise ValidationError('You live too close to work')
return form.total_travel_km
uj5u.com熱心網友回復:
在驗證方法中設定一個表單實體變數:
class RegistrationForm(FlaskForm):
def __init__(self, *args, **kwargs):
super(RegistrationForm, self).__init__(*args, **kwargs)
self.total_travel_km = None
def validate_home_address(self, home_address):
user_loc = locator.geocode(home_address.data)
user_coords = (user_loc.latitude, user_loc.longitude)
one_way = geopy.distance.geodesic(tco_coords, user_coords).km
total_travel_km = one_way * 4
if total_travel_km < self.car_range.data:
raise ValidationError('You live too close to work')
# all good save the total travel in the form
self.total_travel_km = total_travel_km
此外,您可能不想硬編碼汽車范圍限制,您可以在實體化表單時傳遞一個值:
class RegistrationForm(FlaskForm):
def __init__(self, *args, **kwargs):
super(RegistrationForm, self).__init__(*args, **kwargs)
self.total_travel_km = None
self.required_car_range = kwargs.get('required_car_range', 400)
def validate_car_range(self, car_range):
if car_range.data > self.required_car_range:
raise ValidationError('Your car range does not meet our requirements')
并使用如下:
@app.route("/register", methods=['POST', 'GET'])
def register():
form = RegistrationForm(required_car_range=600)
if form.validate_on_submit():
user = User(car_range=form.car_range.data, home_address=form.home_address.data,
car_travel_km=form.total_travel_km)
db.session.add(user)
db.session.commit()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/480641.html
