Python 如果字段数据不变,WTForms将跳过验证

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

我有一个Flask web应用程序,可以管理所有信息亭的信息。我为信息亭的信息创建了一个WTForms对象(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')
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)