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
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)