URLs Dinámicas en Django: Creación y Gestión Eficiente
Resumen
Configurar las URLs en Django es esencial para organizar tu proyecto y facilitar la navegación.
¿Cómo crear un archivo de URLs en Django?
Primero, debes crear un archivo urls.py en cada aplicación que desarrolles. Por ejemplo, si tienes una aplicación llamada MyFirstApp, debes crear un archivo urls.py dentro de esta aplicación.
Crear el archivo: En la aplicación MyFirstApp, crea un archivo llamado urls.py.
Copiar y pegar configuración básica: Puedes copiar la configuración básica de otro archivo de URLs y modificarla según sea necesario.
Eliminar enlaces e importaciones innecesarias: Mantén solo lo necesario para tu aplicación.
dentro de templates/my_first_app/ cree el archivo author_profile.html
Luego dentro de my_first_app modifique el archivo urls.py de la siguiente manera:
Luego de eso modifique el archivo urls.py dentro de my__first_project:
Al modificar el urls del proyeto en la linea 22 quitando carros, al ejecutar el código las rutas quedan:
Finalmente para ver el el perfil del autor:
No se supone que la carpeta que tiene un init no es un módulo sino un paquete y cada archivo *.py es un módulo?
Un paquete es una carpeta que contiene varios módulos, es decir que un archivo es el módulo!
Estás en lo cierto Ray
creo que se confundio con la definicion, pero el concepto esta bien primero se importa el paquete.modulo y luego ya sean las clases o variables o lo que sea que se va a usar.
Me sale un warning que las urls deben empezar sin la barra, así path("/listado", my_view) debe ser cambiado a path("listado", my_view). Sigue funcionando igual, pero desaparece el warning
Aqui tratamos de abordarlo como un app diferente sin embargo nos iba a faltar todos los models jajajja, pero entonces lo abordamos dentro de la misma app, solo buscamos generar como su path propio
en mi punto de vista, vi que varios crean su url concatenando su ID, siento que no es nada seguro porque se podria hacer muchas cosas con ese id que tiene en la url, lo conveniente es manejarlo oculto mas no mostrar por ID, es mi punto de vista ya que hay otros metodos de como hacerlo
Una alternativa puede ser encriptar la url de tal forma que no sea legible para un usuario final, de esa forma se protege el id para no dejarlo expuesto. Igualmente es algo que se recomienda hacer con los datos sensibles, no guardarlos de manera plana en las tablas sino encriptarlos también.
¿Por qué es mejor agrupar las URLs?
Agrupar las URLs por aplicación mantiene tu proyecto escalable y organizado. Imagina que construyes un edificio; no pones los planos eléctricos de todos los apartamentos en un solo documento gigante. En Django, cada aplicación (como un blog, una tienda o un foro) debe ser independiente. Al usar la función include(), le dices al archivo principal de enrutamiento que delegue la responsabilidad a cada módulo. Esto significa que si el día de mañana decides reutilizar tu aplicación de usuarios en otro proyecto distinto, solo tienes que copiar la carpeta entera y sus rutas viajarán con ella sin romper nada. Además, evita que el archivo principal se convierta en un cuello de botella inmanejable cuando tu proyecto crezca a cientos de rutas.
📚 Nombre de la clase
Gestión de URLs en Django: configuración de rutas y manejo de solicitudes
🎯 Idea principal
Django utiliza un sistema de enrutamiento de URLs para dirigir cada solicitud del usuario hacia la vista correspondiente. Las URLs funcionan como el punto de entrada de la aplicación, conectando las peticiones del navegador con la lógica del backend.
⚡ Síntesis en 10 segundos
Las URLs definen las rutas de la aplicación.
Cada URL apunta a una vista específica.
Django usa archivos de configuración para mapear rutas.
El sistema de rutas permite organizar el flujo de la aplicación.
Las solicitudes del usuario se procesan a través del enrutamiento.
🔑 Puntos clave
Sistema de enrutamiento
Django utiliza archivos de configuración de URLs para definir qué vista se ejecuta cuando se accede a una ruta específica.
Relación URL → View
Cada ruta está asociada a una vista que contiene la lógica que responde a la solicitud.
Organización del proyecto
Las URLs pueden organizarse por aplicación para mantener el proyecto estructurado.
Punto de entrada de la aplicación
Las URLs son el primer paso en el procesamiento de una solicitud web.
Flujo de solicitudes
El navegador solicita una URL, Django encuentra la ruta correspondiente y ejecuta la vista asociada.
🧠 Conceptos importantes
URL routing
Sistema que conecta una dirección web con una función o vista del backend.
Solicitud HTTP
Petición que hace el navegador al servidor para obtener información o ejecutar una acción.
Vista
Función o clase que procesa la solicitud y devuelve una respuesta.
Configuración de rutas
Definición de las rutas disponibles dentro de la aplicación.
🧩 Modelo mental de la clase
Usuario accede a una URL
↓
Django revisa la configuración de rutas
↓
Encuentra la vista asociada
↓
La vista procesa la solicitud
↓
Se devuelve una respuesta al navegador
Las URLs actúan como mapa de navegación del backend.
🚀 Acciones inmediatas
Definir las rutas principales de la aplicación.
Asociar cada ruta con una vista específica.
Organizar las URLs por aplicación para mantener claridad.
Revisar el flujo de solicitudes para entender cómo llega la petición a la lógica del sistema.
💼 Aplicación profesional
El sistema de URLs permite estructurar correctamente aplicaciones web:
APIs con endpoints claros
sistemas de navegación en aplicaciones web
organización de módulos del backend
manejo de múltiples funcionalidades dentro del proyecto
Un buen diseño de rutas mejora la legibilidad y escalabilidad del sistema.
🔥 Hacks para la comunidad
Diseñar las URLs pensando en el usuario y en la lógica del sistema.
Mantener rutas simples y descriptivas.
Organizar las rutas por aplicación para evitar configuraciones desordenadas.
Evitar estructuras de URLs demasiado complejas.
📝 Reflexión estratégica
Las URLs representan la arquitectura de acceso de una aplicación web.
Un sistema de rutas bien diseñado permite que el proyecto crezca sin volverse confuso, facilitando la navegación, el mantenimiento y la evolución del sistema.
¡Hola, Platzinautas!
Acá está una solución más desafiante:
Primero utilicé los conocimientos que tenemos con los manager y los modelos para traerlos desde la base de datos:
Espero te sirva de referencia.
my_first_app/models.py
from django.dbimport models
# Importante:Siempre verifica que los campos nuevos que vayas a crear siempre vengan en Null para evitar errores al migrar
# Create your models here.classCar(models.Model): title = models.TextField(max_length=250) year = models.TextField(max_length=4,null=True) color = models.TextField(max_length=50,null=True) drivers = models.ForeignKey('Driver', on_delete=models.CASCADE,null=True) def __str__(self):return f"{self.title} - {self.year}"classDriver(models.Model): name = models.TextField(max_length=100) address = models.TextField(max_length=250,null=True) def __str__(self):return f"{self.name}"classPublisher(models.Model): name = models.TextField(max_length=100) address = models.TextField(max_length=250) def __str__(self):return f"{self.name}"classAuthor(models.Model): name = models.TextField(max_length=200) birth_date = models.DateField() # representation of the console
def __str__(self):return f"{self.name}"classProfile(models.Model): author = models.OneToOneField(Author, on_delete=models.CASCADE) website = models.URLField() biography = models.TextField(max_length=500) # def __str__(self): # return f"Profile of {self}"classBook(models.Model): title = models.TextField(max_length=250) publication_date = models.DateField() publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) authors = models.ManyToManyField(Author, related_name='authors') def __str__(self):return f"{self.title} - {self.publication_date}"
En este caso creamos las rutas para definir los valores que vamos a mostrar desde nuestro template.
Creamos nuestra vista desde nuestra carpeta de templates para poder mostrar otra vista y poder reflejar los datos que se necesitan para mostrarlos en nuestro html de manera dinámica.
En este archivo vamos a definir las colecciones de rutas desde nuestra aplicación
my_first_app/urls.py
"""
URL configuration for my_first_project project.The`urlpatterns` list routes URLs to views.For more information please see:https://docs.djangoproject.com/en/6.0/topics/http/urls/Examples:Function views
1.Add an import:from my_app import views
2.Add a URL to urlpatterns:path('', views.home, name='home')Class-based views
1.Add an import:from other_app.viewsimportHome2.Add a URL to urlpatterns:path('',Home.as_view(), name='home')Including another URLconf1.Import the include()function:from django.urlsimport include, path
2.Add a URL to urlpatterns:path('blog/',include('blog.urls'))"""
from django.urlsimportpathfrom my_first_app.viewsimport profile_view
urlpatterns =[path('profiles/', profile_view),path('profiles/<str:name>/', profile_view)]
Y por último, necesitamos configurar nuestras rutas de nuestro proyecto para terminar con el flujo de la aplicación
my_first_project/urls.py
"""
URL configuration for my_first_project project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/6.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""from django.contrib import admin
from django.urls import path, include
from my_first_app import views
urlpatterns =[ path('admin/', admin.site.urls), path('cars/', views.my_view, name='car_list'), path('users/', include('my_first_app.urls'))]
Espero les sirva.
Reto completado:
urls.py de my first project
from django.contrib import adminfrom django.urls import path, include
urlpatterns = \[ path('admin/', admin.site.urls), path('carros/', include('my\_first\_app.urls')), path('profiles/', include('my\_first\_app.urls'))]
from django.shortcuts import renderfrom my\_first\_app.models import Car, Profile
\# Create your views here.deflist\_cars(request): car\_list = Car.objects.all() context ={"car\_list": car\_list }return render(request,"my\_first\_app/car\_list.html", context)def author\_profile(request,id): profile = Profile.objects.get(id=id)print(f'this is the profile! {profile}') context ={"profile": profile }return render(request,"my\_first\_app/author\_profile.html", context)
finalmente en el html:
\<!DOCTYPEhtml>\<htmllang="en"> \<head> \<metacharset="UTF-8"/> \<metaname="viewport"content="width=device-width, initial-scale=1.0"/> \<title>Profile\</title> \</head> \<body> \<h2>This the profile of {{ profile.author }}\</h2> \<article>{{profile.biography}}\</article> \<p> Visit the website in this link \<ahref="{{ profile.website }}">{{profile.website}}\</a> \</p> \</body>\</html>
Quise hacer que la URL tenga mas sentido mostrando el id del autor y el id del perfil a la vez (un poco mas semantica), por lo que lo hice de la siguiente manera, creando una vista para el autor y dentro de esta, un boton para ver su perfil:
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Car List</title></head><body><h2>Author: {{author.name}}</h2><ul><li>Nombre: {{author.name}} - Año de nacimiento: {{author.birth_date}}</li></ul></body></html>```Y la view:
```python
def author_detail_view(request, id:int):
author = Author.objects.get(id=id)
context = {
'author': author
}
return render(request, "my_first_app/author.html", context)
Comparto mi solución al reto:
- views.py:
from django.shortcuts import render, get_object_or_404from first_app.models import Author, Profile
def authors_information(request, id): author = get_object_or_404(Author, pk=id) # Obtiene el autor por su pk (primary key) profile = get_object_or_404(Profile, author=author) # Obtiene el perfil asociado al autor context = {'profile': profile} return render(request, 'authors_information.html', context)
- urls.py (my_first_proyect):
from django.contrib import adminfrom django.urls import path, include
urlpatterns = [ path('admin/', admin.site.urls), path("carros/", include("first_app.urls")), path("authors/", include("first_app.urls"))]
Me apoyé en mi querido amigo ChatGPT para crear el HTML y tambien para agregar una funcion de Django (get_object_or_404()), que ayuda un poco con el manejo de errores.
Reto resuelto usando filter que vimos en clases pasadas:
Si te ocurre este error 500 puede ser que a mi me pasó importé from django.shortcuts import render, HttpResponseHTTPResponse del módulo http.client en lugar de el módulo HttpResponse de django.shortcuts
Simplemente debes usarlo así:
from django.shortcutsimport render,HttpResponse//...returnHTTPResponse("")