在wtforms中选择field并通过javascrip添加<option>

2024-10-05 15:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在金字塔的一些项目中工作,对wtforms SelectField有问题。在

我有3个SelectField字段:

  • 汽车制造商(如“奥迪”)
  • 汽车型号(例如“奥迪80”)
  • 汽车版本(例如“奥迪80 B4”)。在

我可以在视图中加载汽车。我将通过AJAX/javascript在客户端加载其余SelectFields(car_model,car_version)的选项(选择car_make时,我可以选择car_model,依此类推)。在

问题是,当我提交表格时,汽车型号和汽车版本提出“无效选择”,因为(在选择field.pre_validation431号线)自我选择是空的。在

我怎样才能避开这个问题?在


Tags: 项目版本视图客户端modelajaxjavascriptcar
1条回答
网友
1楼 · 发布于 2024-10-05 15:23:41

您要做的是让WTForms处理“级联选择”(让一个选项的有效字段由另一个字段的值确定)。真的没有一个好的方法来使用内置字段。在

WTForms中的SelectField没有提供一个选项来表示“不要验证所提供的选项是否有效”。您必须提供选项,以便字段验证选择。在

作为shown in the docs,虽然通常可以用静态的选项列表填充选项字段。。。在

class PastebinEntry(Form):
    language = SelectField(u'Programming Language', choices=[('cpp', 'C++'), ('py', 'Python'), ('text', 'Plain Text')])

…但是,由于您是动态生成选项的,因此需要在实例化表单之后设置choices属性。在

^{2}$

在上面的示例中,“group_id”的选项是在金字塔视图中动态填充的。所以,这就是你需要做的:你需要在你的视图中填充选项。这就是您如何使用car_make来解决您的问题(尽管我认为您在您的问题中说过car_make是可以的)。在

但是,您遇到的问题是,car_model的有效选择无法确定,因为它们依赖于{}已经被解析和验证。WTForms并不能很好地处理这个问题(至少对于SelectFields),因为它假设所有字段都应该一次验证。换句话说,为了生成car_model的有效选择列表,首先需要验证car_make的值,鉴于SelectField的工作方式,这是不可能容易做到的。在

我认为最好的方法是创建一个扩展SelectField类型的新字段类型,但删除验证:

class NonValidatingSelectField(SelectField):
    def pre_validate(self, form):
        pass

此新类型重写pre_validate,后者通常执行检查以确定某个选项是否有效。在

如果您将此用于car_model,则不会再有该错误。但是,这意味着你的字段实际上没有被验证!要解决此问题,可以在表单上添加in-line validator。。。在

class MyForm(Form):
    car_make = SelectField(u'Make', choices=[...])
    car_model = NonValidatingSelectField(u'Model', choices=[])

    def validate_car_model(self, field):
        choices = query_for_valid_models(self.car_make.data)
        # check that field.data is in choices...

你可能需要稍微调整一下,让它完全按照你想要的方式工作,我还没有实际测试过这个功能。在

相关问题 更多 >