正在验证用AJAX填充的FlaskForm(FlaskWTForms)SelectField



我在提交一个包含由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从DB中提取的选项。

如果我尝试按原样提交表单,type_id将不会验证,我将得到标准的Not a valid choice错误。

我在其他地方读到,如果我为该字段设置自定义验证函数,它将覆盖常规的FlaskForm验证。不幸的是,Flask-WTF使用下划线来检测需要验证的内容,一旦我添加validate_type_id函数,应用程序就会崩溃。我不认为这个错误是相关的,因为它来自于FlaskForms的构建方式。

我需要想办法绕过。

因此,我尝试创建一个外部验证函数,并在表单内字段的validators=[…]中调用它。没有成功,仍然收到无效的选择错误消息。

我试图通过检查为该字段选择的选项是否存在于DB中来验证该字段。或者,有没有一种方法可以使用validate_fieldName(…(禁用该字段的验证?

我被困在岩石和坚硬的地方之间,我无法更改字段名称以排除下划线,因为这是用于在DB中创建条目的方式。据我所知,在Python中,我只能使用字母、数字和下划线作为变量名,所以从这个角度来看,我很糟糕。

有什么想法吗?

您可以尝试使用QuerySelectField扩展来执行此操作。

https://wtforms.readthedocs.io/en/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的示例:

https://github.com/saltycrane/flask-jquery-ajax-example

它在从Ajax请求获得成功响应时更新select字段。

最新更新