Proyecto Final - Parte 6¶
Introducción¶
En este tema, vamos a estilizar nuestra aplicación Django aplicando CSS a todas las plantillas necesarias. Desde la barra de navegación hasta los formularios de creación y edición, aplicaremos un diseño coherente utilizando variables CSS para los colores y fuentes. Esto permitirá que nuestra aplicación sea funcional y tenga un diseño atractivo y uniforme.
Objetivos Parte VI¶
- Aplicar estilos globales y reset CSS a la aplicación.
- Estilizar el menú de navegación, los formularios de búsqueda, creación y edición.
- Aplicar estilos para las listas de contactos y sus botones de acción.
- Asegurar que los enlaces de acción y el pie de página estén correctamente diseñados.
- Detallar todos los cambios que deben realizarse en las plantillas HTML para aplicar las clases correctamente.
1. Reset de CSS y Variables Globales¶
Fuentes¶
Antes de comenzar vamos a conseguir las fuentes con las que vamos a trabajar. En este caso, usaremos Roboto en sus variantes Bold y Regular.
Descargar fuentes
Puedes buscarlas en https://defont.com/robot y descargarlas.
También te dejo aquí los enlaces:
Una vez descargados los archivos .ttf, colócalos en la carpeta static/fonts/ de tu proyecto Django. Si no tienes esta carpeta, créala.
Código CSS:¶
Comenzamos con el reset de CSS, que limpia todos los márgenes y paddings por defecto que aplican los navegadores, asegurando que todos los elementos comiencen con los mismos estilos. Además, definimos variables CSS para facilitar la gestión de colores y fuentes a lo largo de la aplicación.
| static/css/styles.css | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | |
Explicación:¶
- Variables CSS: Definimos variables para los colores primarios, secundarios, el fondo y el texto, además de las fuentes Roboto.
- Reset CSS: El reset elimina los márgenes, el padding y establece un
box-sizing: border-boxpara asegurar que los bordes y el padding no afecten el tamaño total de los elementos.
2. Estilo para la Barra de Navegación¶
El menú de navegación es uno de los componentes clave de la interfaz, y debe ser claro y fácil de usar. Aplicamos un fondo color primario y estilizamos los enlaces del menú con un efecto hover.
Código CSS:¶
| static/css/styles.css | |
|---|---|
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | |
Explicación:¶
nav: Aplicamos un fondo azul al menú de navegación.nav ul: Usamos flexbox para alinear los elementos horizontalmente y aseguramos que el menú ocupe el ancho completo.- Enlaces del menú (
a): Los enlaces tienen un fondo de color primario y se cambian al color de texto al pasar el ratón (hover).
3. Estilos para la Página de Inicio (index)¶
La página de inicio tiene un título centrado y una pequeña descripción. Queremos asegurarnos de que se vea limpia y profesional, con un espaciado adecuado y un tamaño de fuente apropiado.
Código CSS:¶
| static/css/styles.css | |
|---|---|
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | |
Explicación:¶
h1: Título con un color primario, centrado, y con márgenes para separarlo del contenido.p: El párrafo tiene un color gris para el texto y está centrado en la página.
4. Estilos para los Formularios de Creación y Edición¶
El formulario de creación y edición debe ser atractivo y sencillo de usar. Aplicamos un diseño claro, con bordes suaves, un botón grande y espaciado adecuado entre los campos.
Código CSS:¶
| static/css/styles.css | |
|---|---|
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | |
Explicación:¶
form: El formulario tiene un ancho del 50% y está centrado en la pantalla.button: El botón ocupa todo el ancho y cambia de color al hacer hover (de primario a secundario).
5. Estilos para la Barra de Búsqueda¶
La barra de búsqueda debe ser amplia, con espaciado adecuado y un botón de búsqueda claro.
Código CSS:¶
| static/css/styles.css | |
|---|---|
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | |
Explicación:¶
.search-bar: Aumentamos el ancho de la barra de búsqueda al 70% para darle más visibilidad..btn.search-btn: El botón de búsqueda tiene un fondo primario y cambia al color secundario cuando se pasa el ratón por encima.
6. Estilos para los Enlaces "Sí" y "Cancelar" en delete.html¶
Los enlaces "Sí" y "Cancelar" deben ser claramente visibles, con un estilo de confirmación (rojo para eliminar) y un estilo para cancelar (color primario).
Código CSS:¶
| static/css/styles.css | |
|---|---|
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | |
Conclusión¶
En este tema hemos cubierto los siguientes aspectos:
- Variables CSS para manejar colores y fuentes de manera centralizada.
- Reset de CSS para limpiar los estilos predeterminados del navegador.
- Estilos para el menú de navegación, barra de búsqueda, formularios y pie de página.
- Estilos específicos para las plantillas de búsqueda, creación y edición de contactos, y los enlaces "Sí" y "Cancelar" de la página de eliminación.
¡Entendido! Vamos a repasar los HTML de las plantillas más importantes y añadir las clases necesarias para aplicar los estilos definidos en el CSS. Esto incluye las plantillas de la base, el menú de navegación, y las plantillas de Contactos (index, delete, detail, create, edit), con los atributos class aplicados a los elementos correspondientes.
1. Plantilla base.html (Base de la estructura)¶
Este es el archivo base que se extiende en todas las plantillas. Aquí vamos a definir la estructura básica de la página, incluyendo el menú de navegación y el pie de página.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Mi Gestor Personal{% endblock %}</title>
<link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
<!-- Menú de navegación -->
<nav>
<ul>
<li><a href="{% url 'home' %}">Inicio</a></li>
<li><a href="{% url 'contact_index' %}">Contactos</a></li>
<li><a href="{% url 'task_index' %}">Tareas</a></li>
</ul>
</nav>
<!-- Contenido principal -->
<main>
{% block content %}
{% endblock %}
</main>
<!-- Pie de página -->
<footer>
<p>© 2025 Mi Gestor Personal</p>
</footer>
</body>
</html>
Explicación:¶
- El menú de navegación usa un
<ul>con<li>para los enlaces a Inicio, Contactos y Tareas. - El bloque
{% block content %}es donde se insertarán las plantillas de contenido específicas (como la lista de contactos o tareas). - El pie de página está centrado y tiene un fondo primario.
2. Plantilla contact/index.html (Lista de contactos)¶
Esta plantilla muestra la lista de contactos. Aquí aplicamos clases para la barra de búsqueda, los contactos y los botones de acción.
{% extends 'layout/base.html' %}
{% block title %}Contactos{% endblock %}
{% block content %}
<h1>Lista de Contactos</h1>
<!-- Barra de búsqueda -->
<form method="GET" action="{% url 'contact_index' %}" class="search">
<input type="text" name="search" class="search-bar" value="{{ request.GET.search }}">
<button type="submit" class="btn search-btn">Buscar</button>
</form>
<!-- Lista de contactos -->
<ul class="list">
{% for contact in contacts %}
<li>
<span class="contact-name">{{ contact.name }} {{ contact.last_name }}</span>
<!-- Botones de acción -->
<div class="action-buttons">
<a href="{% url 'contact_detail' contact.id %}" class="btn-detail">Ver</a>
<a href="{% url 'contact_edit' contact.id %}" class="btn-edit">Editar</a>
<a href="{% url 'contact_delete' contact.id %}" class="btn-delete">Eliminar</a>
</div>
</li>
{% endfor %}
</ul>
<!-- Botón para crear un nuevo contacto -->
<div class="aux_btn">
<a href="{% url 'contact_create' %}">Crear Nuevo Contacto</a>
</div>
{% endblock %}
Explicación:¶
search: Se aplica a la barra de búsqueda.contact-name: Se aplica al nombre y apellido del contacto.action-buttons: Se aplica al contenedor de los botones de acción (Ver, Editar, Eliminar).btn-detail,btn-edit,btn-delete: Se aplican a los botones de acción con los colores correspondientes.
3. Plantilla contact/delete.html (Confirmación de eliminación)¶
La plantilla delete.html pregunta al usuario si está seguro de eliminar un contacto. Aquí agregamos clases a los enlaces para la confirmación y la cancelación.
{% extends 'layout/base.html' %}
{% block title %}Eliminar Contacto{% endblock %}
{% block content %}
<h1>¿Estás seguro de que quieres eliminar el contacto {{ contact.name }}?</h1>
<form method="POST">
{% csrf_token %}
<button type="submit" class="confirm">Sí, eliminar</button>
</form>
<div class="delete-action">
<a href="{% url 'contact_index' %}" class="cancel">Cancelar</a>
</div>
{% endblock %}
Explicación:¶
confirm: Se aplica al botón "Sí, eliminar".cancel: Se aplica al enlace "Cancelar".
4. Plantilla contact/detail.html (Detalle del contacto)¶
La plantilla detail.html muestra los detalles de un contacto específico. Aquí, solo necesitamos aplicar la clase contact-name al nombre del contacto.
{% extends 'layout/base.html' %}
{% block title %}Detalle del Contacto{% endblock %}
{% block content %}
<h1>{{ contact.name }} {{ contact.last_name }}</h1>
<ul>
<li><strong>Teléfono:</strong> {{ contact.phone }}</li>
<li><strong>Móvil:</strong> {{ contact.mobile }}</li>
<li><strong>Correo:</strong> {{ contact.email }}</li>
<li><strong>Compañía:</strong> {{ contact.company }}</li>
<li><strong>Notas:</strong> {{ contact.notes }}</li>
<li><strong>Fecha de creación:</strong> {{ contact.date }}</li>
</ul>
<a href="{% url 'contact_index' %}" class="btn-detail">Volver a la lista</a>
{% endblock %}
Explicación:¶
btn-detail: Se aplica al enlace para volver a la lista de contactos.
5. Plantilla contact/create.html (Formulario de creación)¶
Esta plantilla contiene el formulario para crear un nuevo contacto. Aquí aplicamos las clases al formulario y al botón de envío.
{% extends 'layout/base.html' %}
{% block title %}Crear Contacto{% endblock %}
{% block content %}
<h1>Crear Nuevo Contacto</h1>
<form method="POST" class="form-contact">
{% csrf_token %}
<label for="name">Nombre:</label>
<input type="text" name="name" id="name" required>
<label for="last_name">Apellido:</label>
<input type="text" name="last_name" id="last_name" required>
<label for="phone">Teléfono:</label>
<input type="text" name="phone" id="phone">
<label for="mobile">Móvil:</label>
<input type="text" name="mobile" id="mobile" required>
<label for="email">Correo Electrónico:</label>
<input type="email" name="email" id="email" required>
<label for="company">Compañía:</label>
<input type="text" name="company" id="company">
<label for="notes">Notas:</label>
<textarea name="notes" id="notes"></textarea>
<button type="submit">Guardar Contacto</button>
</form>
<div class="aux_btn">
<a href="{% url 'contact_index' %}">Volver a la lista de contactos</a>
</div>
{% endblock %}
Explicación:¶
form-contact: Se aplica al formulario de creación de contacto.- Botón de enviar: El botón se estiliza con las clases de botón ya definidas en el CSS.
6. Plantilla contact/edit.html (Formulario de edición)¶
Esta plantilla es similar al formulario de creación, pero con los datos ya pre-llenados. Aquí también aplicamos las clases para que el estilo sea consistente.
{% extends 'layout/base.html' %}
{% block title %}Editar Contacto{% endblock %}
{% block content %}
<h1>Editar Contacto</h1>
<form method="POST" class="form-contact">
{% csrf_token %}
<label for="name">Nombre:</label>
<input type="text" name="name" id="name" value="{{ contact.name }}" required>
<label for="last_name">Apellido:</label>
<input type="text" name="last_name" id="last_name" value="{{ contact.last_name }}" required>
<label for="phone">Teléfono:</label>
<input type="text" name="phone" id="phone" value="{{ contact.phone }}">
<label for="mobile">Móvil:</label>
<input type="text" name="mobile" id="mobile" value="{{ contact.mobile }}" required>
<label for="email">Correo Electrónico:</label>
<input type="email" name="email" id="email" value="{{ contact.email }}" required>
<label for="company">Compañía:</label>
<input type="text" name="company" id="company" value="{{ contact.company }}">
<label for="notes">Notas:</label>
<textarea name="notes" id="notes">{{ contact.notes }}</textarea>
<button type="submit">Guardar Cambios</button>
</form>
<div class="aux_btn">
<a href="{% url 'contact_index' %}">Volver a la lista de contactos</a>
</div>
{% endblock %}
Explicación:¶
form-contact: Aplicamos la misma clase al formulario de edición.- Campos pre-llenados: Los campos tienen valores pre-llenados con los datos del contacto a editar, gracias a las variables de Django como
{{ contact.name }}.
Conclusión¶
En esta práctica, hemos:
- Añadido las clases CSS necesarias a las plantillas de Contactos para aplicar los estilos.
- Explicado cómo modificar las plantillas HTML para integrar las clases y hacer que los estilos se apliquen correctamente.
- Realizado los ajustes para garantizar que los botones, enlaces y formularios tengan un diseño coherente y atractivo.
Este es el paso final para que los alumnos puedan completar la aplicación de Tareas de manera similar, basándose en el CRUD de Contactos.
¿Todo claro con los cambios en las plantillas y las clases? Si todo está bien, los estudiantes ya tienen todo lo necesario para trabajar en el CRUD de Tareas. ¡Avísame si necesitas más detalles o ajustes!