我在提交一个包含由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字段。