【问题标题】:WTForms custom validator- RequiredIf on a RadioFieldWTForms 自定义验证器 - 需要在 RadioField 上
【发布时间】:2018-11-21 04:58:39
【问题描述】:

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

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 codethis is not a valid choice 始终为 code2 返回。我想要一个验证器,它需要任何类型的字段(包括 RadioField)的输入,以另一个字段的值为条件(在这种情况下为code=1)。

【问题讨论】:

    标签: validation flask radio-button flask-wtforms wtforms


    【解决方案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
    

    希望这会有所帮助。

    【讨论】:

    • 嗨 Danila,我不知道如何开始创建自定义验证器。我提供的那个是别人创建的。您能否更新您的答案以说明如何扩展我的验证器的功能以也适用于 RadioFields?
    • @machump 你能解释一下你在我的回答中不明白的地方吗?您可以为RadioFields 和任何字段创建任何自定义逻辑。
    • 如果另一个字段(字段 0)对应于某个值,我发布的验证器要求用户输入数据(字段 1)。这似乎适用于除 RadioFields 之外的所有字段 1 类型。您可以将我的验证器中的逻辑合并到您的答案中吗?
    • @machump 显示您的表单,数据示例 + 预期输出
    • 我用一个示例表单更新了最初的帖子,并描述了我得到的输出。
    猜你喜欢
    • 2017-02-03
    • 2019-04-05
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多