有沒有辦法做到這一點?
下面是我正在嘗試做的一個例子:
class TestForm(FlaskForm):
email = EmailField('Email', validators=[InputRequired('Email is required.')])
start = SubmitField()
然后在一條路線中:
del form.email.validators
# I also tried:
form.email.validators.remove
基本上我想使用存盤的資料來確定預定義表單是否需要該欄位。
uj5u.com熱心網友回復:
在您的視圖中動態創建表單的內部子類。從內部子類的欄位中洗掉任何驗證器,然后從內部子類中實體化一個表單。在代碼中,類似于:
定義一個表單,該first_name欄位有兩個驗證器。
class TestForm(FlaskForm):
first_name = StringField(validators=[InputRequired(), Length(8)])
submit = SubmitField()
在您看來:
# Dynamic subclass
class F(TestForm):
pass
# Remove the length validator.
# Validators are in a dict called kwargs
validators = F.first_name.kwargs.get('validators')
for validator in validators:
if isinstance(validator, Length):
validators.remove(validator)
# instance a form
_form = F()
# use the form ....
單個檔案示例 app.py:
from flask import Flask, render_template_string
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import InputRequired, Length
app = Flask(__name__)
app.config['SECRET_KEY'] = '13332311ecd738748f27a992b6189d3f5f30852345a1d5261e3e9d5a96722fb9'
class TestForm(FlaskForm):
first_name = StringField(validators=[InputRequired(), Length(8)])
submit = SubmitField()
html_template = '''
{% if form.first_name.errors %}
<ul >
{% for error in form.first_name.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
<form role="form" method="post" action="" name="Form1">
{{ form.hidden_tag() }}
{{ form.first_name }}
{{ form.submit() }}
</form>
'''
success_template = '''
<h1>Success</h1>
'''
@app.route('/', methods=['GET', 'POST'])
def index():
# Dynamic subclass
class F(TestForm):
pass
# Remove the length validator.
# Validators are in a dict called kwargs
validators = F.first_name.kwargs.get('validators')
for validator in validators:
if isinstance(validator, Length):
validators.remove(validator)
# instance a form
_form = F()
# print the validators
for field in _form:
print(f"Field: {field.name} has {len(field.validators)} validator(s)")
for validator in field.validators:
print(validator)
if _form.validate_on_submit():
print('Validation passed')
return render_template_string(success_template)
return render_template_string(html_template, form=_form)
if __name__ == '__main__':
app.run()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491911.html
標籤:烧瓶 烧瓶-wtforms wtforms
上一篇:燒瓶在多對多資料庫中存盤多選專案
