Python 如果字段数据不变,WTForms将跳过验证
我有一个Flask web应用程序,可以管理所有信息亭的信息。我为信息亭的信息创建了一个WTForms对象(forms.py):Python 如果字段数据不变,WTForms将跳过验证,python,flask,flask-wtforms,wtforms,Python,Flask,Flask Wtforms,Wtforms,我有一个Flask web应用程序,可以管理所有信息亭的信息。我为信息亭的信息创建了一个WTForms对象(forms.py): class KioskForm(瓶形): kiosk_name=StringField('kiosk name',验证器=[DataRequired()])) kiosk_site=SelectField('kiosk's site',validators=[DataRequired()])) 信息亭位置=StringField( '信息亭的位置',验证器=[Data
class KioskForm(瓶形):
kiosk_name=StringField('kiosk name',验证器=[DataRequired()]))
kiosk_site=SelectField('kiosk's site',validators=[DataRequired()]))
信息亭位置=StringField(
'信息亭的位置',验证器=[DataRequired()])
kiosk_ip=StringField('ip地址',验证器=[
IPAddress(),DataRequired())
kiosk_mac=StringField('mac Address',validator=[DataRequired()]))
submit=SubmitField('submit')
def validate_kiosk_名称(自身、kiosk_名称):
kiosk=db.session.query(KioskConf).filter\u by(
设备名称=self.kiosk\u name.data).first()
如果信息亭不是无:
引发ValidationError('信息亭名称已存在')
假设我想编辑现有信息亭的信息(routes.py):
@app.route('/edit_kiosk/',methods=['GET','POST'])
def编辑(信息亭名称):
data=db.session.query(KioskConf).filter\u by(
设备名称=信息亭名称).first()
表单=信息亭表单(信息亭名称=数据设备名称,
信息亭位置=数据设备位置,
kiosk_ip=数据设备_ip,
kiosk_mac=数据设备(mac)
... ...
我想做的是:如果有人把一个信息亭的名字改成另一个现有的,它会抱怨这个名字已经存在。验证在forms.py中
但是,一个问题是,如果我编辑了一个现有的信息亭,可能更改了ip地址,但名称保持不变,在提交时仍然抱怨名称已经存在。这里的名称验证一定有问题
如果名称未更改,如何使WTForms跳过名称验证?我无法在本地运行此逻辑并确认它是否有效,但我在过去实施过类似的解决方案。试试这个,如果对你有帮助就告诉我。干杯 -安德鲁
从表单导入初始化\u控制器\u表单
@app.route('/edit_kiosk/',methods=['GET','POST'])
def编辑(信息亭名称):
data=db.session.query(KioskConf).filter\u by(
设备名称=信息亭名称).first()
KioskForm=initializeKioskForm(编辑布尔值=True)
表单=信息亭表单(信息亭名称=数据设备名称,
信息亭位置=数据设备位置,
kiosk_ip=数据设备_ip,
kiosk_mac=数据设备(mac)
我无法在本地运行此逻辑并确认它是否有效,但我在过去实施过类似的解决方案。试试这个,如果对你有帮助就告诉我。干杯
-安德鲁
从表单导入初始化\u控制器\u表单
@app.route('/edit_kiosk/',methods=['GET','POST'])
def编辑(信息亭名称):
data=db.session.query(KioskConf).filter\u by(
设备名称=信息亭名称).first()
KioskForm=initializeKioskForm(编辑布尔值=True)
表单=信息亭表单(信息亭名称=数据设备名称,
信息亭位置=数据设备位置,
kiosk_ip=数据设备_ip,
kiosk_mac=数据设备(mac)
因此,我提出了一个完全符合我要求的解决方案,尽管最终的代码库有点笨重
在forms.py中,添加一个初始化器以存储原始字段数据,并用于比较新数据:
class KioskForm(瓶形):
kiosk_name=StringField('kiosk name',验证器=[DataRequired()]))
kiosk_site=SelectField('kiosk's site',validators=[DataRequired()]))
信息亭位置=StringField(
'信息亭的位置',验证器=[DataRequired()])
kiosk_ip=StringField('ip地址',验证器=[
IPAddress(),DataRequired())
kiosk_mac=StringField('mac Address',validator=[DataRequired()]))
submit=SubmitField('submit')
#初始化器
定义初始化(self,原始名称,*args,**kwargs):
超级(信息亭窗体,自我)。\uuuuu初始值(*args,**kwargs)
self.original\u name=原始\u名称
#更改为比较新旧数据
def validate_kiosk_名称(自身、kiosk_名称):
如果kiosk_name.data!=self.u原始名称:
kiosk=db.session.query(KioskConf).filter\u by(
设备名称=self.kiosk\u name.data).first()
如果信息亭不是无:
引发ValidationError('Kiosk ID已存在')
在routes.py中,将原始名称输入到原始名称中:
@app.route('/edit_kiosk/',methods=['GET','POST'])
def编辑(信息亭名称):
data=db.session.query(KioskConf).filter\u by(
设备名称=信息亭名称).first()
表单=信息亭表单(信息亭名称=数据设备名称,
信息亭位置=数据设备位置,
kiosk_ip=数据设备_ip,
kiosk_mac=数据设备_mac,
原始名称=数据设备名称
)
... ...
因此,我提出了一个完全符合我要求的解决方案,尽管最终的代码库有点笨重
在forms.py中,添加一个初始化器以存储原始字段数据,并用于比较新数据:
class KioskForm(瓶形):
kiosk_name=StringField('kiosk name',验证器=[DataRequired()]))
kiosk_site=SelectField('kiosk's site',validators=[DataRequired()]))
信息亭位置=StringField(
'信息亭的位置',验证器=[DataRequired()])
kiosk_ip=StringField('ip地址',验证器=[
IPAddress(),DataRequired())
kiosk_mac=StringField('mac Address',validator=[DataRequired()]))
submit=SubmitField('submit')
#初始化器
定义初始化(self,原始名称,*args,**kwargs):
超级(信息亭窗体,自我)。\uuuuu初始值(*args,**kwargs)
self.original\u name=原始\u名称
#更改为比较新旧数据
def initializeKioskForm(edit_boolean):
# only validate if edit_boolean is false
if edit_boolean == False:
kiosk = db.session.query(KioskConf).filter_by(
equipment_name=self.kiosk_name.data).first()
if kiosk is not None:
raise ValidationError('Kiosk Name existed.')
class KioskForm(FlaskForm):
kiosk_name = StringField('Kiosk Name', validators=[DataRequired()])
kiosk_site = SelectField('Kiosk\'s Site', validators=[DataRequired()])
kiosk_location = StringField(
'Kiosk\'s Location', validators=[DataRequired()])
kiosk_ip = StringField('IP Address', validators=[
IPAddress(), DataRequired()])
kiosk_mac = StringField('MAC Address', validators=[DataRequired()])
submit = SubmitField('Submit')
return KioskForm
from forms import initialize_controller_form
@app.route('/edit_kiosk/<kiosk_name>', methods=['GET', 'POST'])
def edit(kiosk_name):
data = db.session.query(KioskConf).filter_by(
equipment_name=kiosk_name).first()
KioskForm = initializeKioskForm(edit_boolean=True)
form = KioskForm(kiosk_name=data.equipment_name,
kiosk_location=data.equipment_location,
kiosk_ip=data.equipment_ip,
kiosk_mac=data.equipment_mac)