我在提交包含由AJAX填充的SelectField的表单时遇到了一些麻烦。不要介意变量名前面的字母,因为它们是自动生成的,所以它们在那里可以设置顺序:
class CreateEmployeeForm(FlaskForm):
code = StringField(
'Employee Code', validators=[DataRequired(), Length(max=16)]
)
a__first_name = StringField(
'First Name', validators=[DataRequired(), Length(max=128)]
)
aa__last_name = StringField(
'Last Name', validators=[DataRequired(), Length(max=128)]
)
email = StringField(
'Email', validators=[DataRequired(), Email(), Length(max=128)]
)
start_date = DateField(
'Start Date', format='%Y-%m-%d', validators=[Optional()]
)
phone = StringField(
'Telephone', validators=[DataRequired(), Length(min=10, max=16)]
)
type_id = SelectField(
'Employee Type', choices=[], coerce=int,
validators=[not_blank, v_employee_type],
render_kw={'class': 'dropdown_pop', 'id': 'Employee_type:name'}
)
z__password = PasswordField(
'Password', validators=[DataRequired(), Length(min=8)]
)
z__password2 = PasswordField(
'Repeat Password', validators=[DataRequired(), EqualTo('z__password')]
)
zzzz__submit = SubmitField(
'Create Employee', render_kw={'class': 'submit_btn'}
)
def validate_code(self, code):
user = Employee.query.filter_by(code=code.data).first()
if user is not None:
raise ValidationError('This employee id is already taken.')
def validate_email(self, email):
user = Employee.query.filter_by(email=email.data).first()
if user is not None:
raise ValidationError('Please use a different email address.')
有问题的问题是type_id
在渲染时使用通过jQuery调用API从数据库中提取的选择来填充的。
如果我尝试按原样提交表单,type_id
将无法验证并且会收到标准Not a valid choice
错误。
我在其他地方读到,如果我为此字段设置了自定义验证功能,它将覆盖常规的FlaskForm验证。不幸的是,Flask-WTF
使用下划线来检测需要验证的内容,并在我添加validate_type_id
功能后立即使应用程序崩溃。我认为该错误无关紧要,因为它来自于FlaskForms
构建方式。
我需要找到解决方法。
因此,我尝试创建一个外部验证函数,并在表单内字段内的validateators = [...]中调用它。没用,仍然收到无效选择错误消息。
我正在尝试通过检查数据库中是否存在为该字段选择的选项来验证该字段。或者,有没有一种方法可以不使用validate_ fieldName(...)禁用对该字段的验证?
我被困在一块困难的地方,我不能更改字段名称以排除下划线,因为这是用来在数据库中创建条目的方式。从我所读的内容中,我只能使用字母,数字和下划线作为Python中的变量名,因此从这个角度来看,我很困惑。
有任何想法吗?
您可以尝试使用QuerySelectField
扩展程序来执行此操作。
https://wtforms.readthedocs.io/zh/2.3.x/ext/#wtforms.ext.sqlalchemy.fields.QuerySelectField
那样 Submitting a choice which is not in the query will result in a validation error.
另外,您可以看一下这里提供的有关如何通过Ajax填充WTForm的示例:
在从Ajax请求获得成功响应后,它将更新选择字段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句