代码之家  ›  专栏  ›  技术社区  ›  machump

wtforms自定义验证器-radiofield上的requiredif

  •  1
  • machump  · 技术社区  · 8 年前

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

    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 . 我如何适应验证器,这也适用于放射性纤维?

    就目前而言,无论验证条件是否适用, 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)])
    

    不管布尔场 code 是否检查过, this is not a valid choice 总是为了 code2 . 我想要一个验证器,它要求输入任何类型的字段(包括radiofield),条件是另一个字段的值( code=1 在这种情况下)。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Danila Ganchar    8 年前

    更新! . 您可以使用任何自定义处理 __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
    

    再举一个例子 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
    

    希望这有帮助。

    推荐文章