validation - WTForms 自定义验证器 - RadioField 上的RequiredIf

标签 validation flask radio-button flask-wtforms wtforms

我借用了一个验证器,如果另一个字段的值是某个值,则要求用户输入数据:

class RequiredIf(object):
    def __init__(self, *args, **kwargs):
            self.conditions = kwargs
    def __call__(self, form, field):
            for name, data in self.conditions.items():
                if name not in form._fields:
                    Optional(form, field)
                else:
                    condition_field = form._fields.get(name)
                if condition_field.data == data and not field.data:
                    DataRequired()(form, field)
                    Optional()(form, field)

当包含 validator 参数的字段是 TextField 时,此方法非常有效,但当该字段是 RadioField< 时,它似乎不起作用。如何调整验证器以便它也适用于 RadioFields?

就目前情况而言,无论验证条件是否适用,RadioField 始终返回not a valid choice

提前致谢。

例如:

class new_form(Form):
    code=BooleanField('Do you code?')
    code2=RadioField('If so, what languages do you use?',
        choices=[('python','python'),('C++','C++')],
        validators=[RequiredIf(code=1)])

无论是否检查 BooleanField codecode2 始终返回 这不是有效选择。我想要一个验证器,它需要任何类型字段(包括 RadioField)的输入,并以另一个字段的值为条件(在本例中为 code=1)。

最佳答案

已更新!。您可以使用 __call__ 创建任何自定义处理。示例:

from multidict import CIMultiDict
from wtforms import Form, RadioField, BooleanField


class RequiredIf(object):

    def __init__(self, **kwargs):
        self.conditions = kwargs

    def __call__(self, form, field):
        # NOTE! you can create here any custom processing
        current_value = form.data.get(field.name)
        if current_value == 'None':
            for condition_field, reserved_value in self.conditions.items():
                dependent_value = form.data.get(condition_field)
                if condition_field not in form.data:
                    continue
                elif dependent_value == reserved_value:
                    # just an example of error
                    raise Exception(
                        'Invalid value of field "%s". Field is required when %s==%s' % (
                            field.name,
                            condition_field,
                            dependent_value
                        ))

class NewForm(Form):
    code = BooleanField('Do you code?')
    code2 = RadioField(
        'If so, what languages do you use?',
        choices=[('python', 'python'), ('C++', 'C++')],
        validators=[RequiredIf(code=True)])

form = NewForm(formdata=CIMultiDict(code=True, code2='python'), )
form.validate()  # valid data - without errors

# invalid data
form = NewForm(formdata=CIMultiDict(code=True), )
form.validate()  # invalid data - Exception: Invalid value of field "code2". Field is required when code==True

再一个例子,2 RadioField :

class NewForm(Form):
    list_one = RadioField('City/Country', choices=['city', 'country'])
    list_two = RadioField(
        'Cities',
        choices=[('minsk', 'Minsk'), ('tbilisi', 'Tbilisi')],
        validators=[RequiredIf(list_one='city')])


form = NewForm(formdata=CIMultiDict(list_one='city', list_two='minsk'), )
form.validate()  # without errors
form = NewForm(formdata=CIMultiDict(list_one='country'), )
form.validate()  # without errors
form = NewForm(formdata=CIMultiDict(list_one='city'), )
form.validate()  # invalid data - Exception: Invalid value of field "list_two". Field is required when list_one==city

希望这有帮助。

关于validation - WTForms 自定义验证器 - RadioField 上的RequiredIf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50806257/

相关文章:

ruby-on-rails - Rails 中的 REST API 参数验证

python - 如何在 Flask 中提供静态文件

python - 通过 flask + redis 服务文件

php - laravel 7 在注册表中添加 radio

Adobe LiveCycle 中单选按钮的 Javascript

javascript - 我如何使用 jquery TOOLS 验证表单,指示错误消息的位置

java - 您使用什么来验证 XML 模式?

android - 需要检查文件是否是有效的 APK

python - Flask 按钮将变量传递回 python

java - Android RadioButtons 看起来太亮