使用 python 循环验证表单时出现问题

问题描述 投票:0回答:1

我正在尝试以更有效的方式验证我的字段,我认为我走在正确的轨道上,但是我的for循环有问题,代码如下

首先我通过字典来管理所有字段

listaCondicion = {
        "nombre" : {"min":3},
        "apellido" : {"min":4},
        "cedula" : {"min":7, "query":consulta.verficarCedula, "param":[f"{tipoCedula.value}-{cedula.value}",], "msj":"Esta cedula ya esta ligada a un usuario"},
        "numTelefono" : {"min":7, "query":consulta.verficarNumero, "param":[f"{codigoTelefono.value}-{numTelefono.value}",], "msj":"Este numero de telefono ya esta asignado a un usuario"},
        "correo" : {"min":3, "query":consulta.verificarCorreo, "param":[f"{correo.value}{tipoCorreo.value}",], "msj":"Este correo ya esta en uso"},
        "ubicacion" : {"min":3, "query":consulta.verficarUbicacion, "param":[ubicacion.value,], "msj":"Esta ubicacion ya esta en uso"},
        "nivelUser" : {"min":4},
        "tipoCorreo" : {"min":4},
        "codigoTelefono" : {"min":4}
    }

然后我用 for 遍历该字典并将其中的值传递给它

todoValido = True
    print(todoValido)

    for nombreCampo, config in listaCondicion.items():
        if bool(validaciones.validarCampos(page, eval(nombreCampo), config["min"])) == True:
            print("entro en la validacion de campos")
            todoValido = False
        if "query" in config:
            if bool(validaciones.validarConsultas(page, config["query"], config["param"], config["msj"])) or todoValido == True:
                todoValido = False
                print("paso por validacion de la consulta")
        else: print("no paso nada")
    
    print(todoValido)

    if todoValido == True:
        print("pasaste a la siguiente seccion del formulario")

    print()

在界面中,您可以看到它显然工作正常,但我在其中添加了一些打印以更好地遵循周期,它总是给我这个结果

True
no paso nada
no paso nada
paso por consulta
no paso nada
no paso nada
no paso nada
False

我不知道该怎么办,它总是忽略第一个条件,如果所有字段都经过正确验证,它不会让我进入下一个表单

这是我用来验证的类,以防您需要它

class validaciones:
#CONDICIONES
condicionAlfanum = r"^[0-9A-Za-z]*$"
condicionEspacio = r"^[^\s]+$"

def validarCampos(page, campo, min):
    if not campo.value:
        campo.error_text = mensaje.campoFaltante
        page.update()
        return False
    elif len(campo.value) < min:
        campo.error_text = mensaje.minimoCaracteres(min)
        page.update()
        return False

def validarConsultas(page, consulta, parametros, mensaje):
    if db.consultaConRetorno(consulta, parametros):
        page.snack_bar = SnackBar(content=Text(mensaje))
        page.snack_bar.open = True
        page.update()
        return False

我希望你能帮助我,如果我能让它工作,我将能够将其应用到我的所有代码中,提前感谢

python for-loop validation if-statement conditional-statements
1个回答
0
投票

问题是:

  • 您在开始时将一个名为 todoValido 的变量设置为 True,这意味着 一切都好。
  • 当你检查每个字段时,如果有问题,你想要设置 todoValido 为 False(表示存在问题)。
  • 但是,您写支票的方式可能会导致混乱 结果,有时它无法正确更新 todoValido。

要改变什么

  1. 直接检查:而不是检查函数是否返回 True bool(...) == True,只需检查它是否返回 False。如果是的话,你 知道有问题。
  2. 简化逻辑:删除不必要的检查,这些检查可以使事情变得简单 令人困惑。如果满足以下条件,您只需将 todoValido 设置为 False: 验证失败。
  3. 信息性消息:添加明确的消息,告诉您哪个字段 验证失败。这可以帮助您了解出了什么问题。

这是要更正的代码

todoValido = True  # Start by assuming everything is valid

for nombreCampo, config in listaCondicion.items():
    # Check if the field is valid
    if not validaciones.validarCampos(page, eval(nombreCampo), config["min"]):
        todoValido = False  # Set to False if there's a problem
        print(f"Validation failed for field: {nombreCampo}")  # Tell which field failed
    
    # Check if there's a query to validate
    if "query" in config:
        if not validaciones.validarConsultas(page, config["query"], config["param"], config["msj"]):
            todoValido = False  # Set to False if there's a problem
            print(f"Query validation failed for field: {nombreCampo}")  # Tell which field's query failed

# Check if everything is valid
if todoValido:
    print("You can move to the next section of the form")  # All fields are valid
else:
    print("Some fields have errors, please check.")  # There are issues
© www.soinside.com 2019 - 2025. All rights reserved.