Callback error updating ..page-content.children...url.pathname

I have a problem with my code if I change

html.Div([
               html.Label("Tipo de usuario:"),
               dcc.RadioItems(
                   id="register-user-type-input",
                   options=[
                       {"label": "Entrenador", "value": "entrenador"},
                       {"label": "Deportista", "value": "deportista"}
                   ],
                   value=None,
                   labelStyle={"display": "block"}
               )
           ], className="form-group"),"

for

 html.Div([
                html.Label("Tipo de usuario:"),
                dcc.Dropdown(
                    id="register-user-type-input",
                    options=[
                        {"label": "Deportista", "value": "deportista"},
                        {"label": "Entrenador", "value": "entrenador"}
                    ],
                    placeholder="Seleccionar tipo de usuario",
                    value=None,
                    required=True
                )
            ], className="form-group"),

the program gives me the error on the topic name. I donā€™t know how to solve it. Maybe someone can help :slight_smile:
The whole script is:

app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP], suppress_callback_exceptions=True)
app.config.suppress_callback_exceptions = True
# Definir el diseƱo de la pƔgina principal
app.layout = html.Div([
    # Barra de navegaciĆ³n
    dbc.NavbarSimple(
        children=[
            dbc.NavItem(dbc.NavLink("Inicio", href="/")),
            dbc.DropdownMenu(
                children=[
                    dbc.DropdownMenuItem("AnƔlisis de entrenamiento", href="/analisis-entrenamientos"),
                    dbc.DropdownMenuItem("Zonas de atletas", href="/tabla-zonas")
                ],
                nav=True,
                in_navbar=True,
                label="MenĆŗ"
            ),
            dbc.NavItem(dbc.NavLink("Login", href="/login")),
        ],
        brand="Mi AplicaciĆ³n",
        brand_href="/",
        color="primary",
        dark=True
    ),
    # Contenido de la pƔgina
    dcc.Location(id="url"),
    html.Div(id="page-content", className="container mt-5")
])

# Definir la pƔgina de inicio
@app.callback(
    [Output("page-content", "children"), Output("url", "pathname")],
    [Input("url", "pathname")]
)
def render_page_content(pathname):
    if pathname == "/":
        return html.Div([
            html.H1("Bienvenido a la pƔgina de inicio"),
            dbc.Button("Registrate aquĆ­", id="register-button", href="/register")
        ]), pathname
    elif pathname == "/analisis-entrenamientos":
        return html.H1("PƔgina de anƔlisis de entrenamientos"), pathname
    elif pathname == "/tabla-zonas":
        return html.H1("PƔgina de tabla de zonas"), pathname
    elif pathname == "/login":
        return render_login_page(), pathname
    elif pathname == "/register":
        return render_register_page(), pathname
    else:
        return html.H1("PƔgina no encontrada"), pathname

def render_login_page():
    return html.Div([
        html.H2("Inicio de sesiĆ³n"),
        html.Form([
            html.Div([
                html.Label("Nombre de usuario:"),
                dcc.Input(id="username-input", type="text", required=True)
            ], className="form-group"),
            html.Div([
                html.Label("ContraseƱa:"),
                dcc.Input(id="password-input", type="password", required=True)
            ], className="form-group"),
            html.Button("Iniciar sesiĆ³n", id="login-button", n_clicks=0, className="btn btn-primary"),
        ], className="form")
    ])

def validate_user_data(firstname, lastname, email, user_type, password, confirm_password):
    existing_usernames = ["username1", "username2"]  # Ejemplo de lista de nombres de usuario existentes
    errors = []

    # Validar si ya existe el nombre de usuario
    if firstname in existing_usernames:
        errors.append("El nombre de usuario ya estĆ” en uso.")

    # Validar que las contraseƱas coincidan
    if password != confirm_password:
        errors.append("Las contraseƱas no coinciden.")

    # Validar la fortaleza de la contraseƱa
    if not re.search(r"(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}", password):
        errors.append(
            "La contraseƱa debe contener al menos 8 caracteres, incluyendo una letra mayĆŗscula, una letra minĆŗscula y un nĆŗmero."
        )

    # Validar el formato del correo electrĆ³nico
    if not re.match(r"[^@]+@[^@]+\.[^@]+", email):
        errors.append("El formato del correo electrĆ³nico no es vĆ”lido.")

    return errors

def render_register_page():
    return html.Div([
        html.H2("Registro"),
        html.Form([
            html.Div([
                html.Label("Nombre:"),
                dcc.Input(id="register-firstname-input", type="text", required=True)
            ], className="form-group"),
            html.Div([
                html.Label("Apellido(s):"),
                dcc.Input(id="register-lastname-input", type="text", required=True)
            ], className="form-group"),
            html.Div([
                html.Label("Correo electrĆ³nico:"),
                dcc.Input(id="register-email-input", type="email", required=True)
            ], className="form-group"),
            html.Div([
                html.Label("Tipo de usuario:"),
                dcc.Dropdown(
                    id="register-user-type-input",
                    options=[
                        {"label": "Deportista", "value": "deportista"},
                        {"label": "Entrenador", "value": "entrenador"}
                    ],
                    placeholder="Seleccionar tipo de usuario",
                    value=None,
                    required=True
                )
            ], className="form-group"),
            html.Div([
                html.Label("ContraseƱa:"),
                dcc.Input(id="register-password-input", type="password", required=True)
            ], className="form-group"),
            html.Div([
                html.Label("Confirmar contraseƱa:"),
                dcc.Input(id="register-confirm-password-input", type="password", required=True)
            ], className="form-group"),
            html.Button("Registrarse", id="register-button2", n_clicks=0, className="btn btn-primary"),
            html.Div(id="register-error-message", className="text-danger")  # Para mostrar los mensajes de error
        ], className="form")
    ])

@app.callback(
    Output("register-error-message", "children"),
    [Input("register-button2", "n_clicks")],
    [
        State("register-firstname-input", "value"),
        State("register-lastname-input", "value"),
        State("register-email-input", "value"),
        State("register-user-type-input", "value"),
        State("register-password-input", "value"),
        State("register-confirm-password-input", "value")
    ]
)
def validate_registration(n_clicks, firstname, lastname, email, user_type, password, confirm_password):
    if n_clicks is not None and n_clicks > 0:
        errors = validate_user_data(firstname, lastname, email, user_type, password, confirm_password)
        if errors:
            return html.Ul([html.Li(error) for error in errors])
        else:
            return "Registro exitoso. Ā”Bienvenido!"
    return ""

if __name__ == '__main__':
    app.run_server(debug=True)

There is no property required for a dropdown in dash. Refer the documentation

1 Like