Introducción a Django creando un blog muy simple

Páginas dinámicas

En esta última lección vamos a introducir el concepto de las páginas dinámicas añadiendo una nueva página para visualizar las entradas individualmente en lugar de mostrar todo su contenido en la lista.

La clave está en pasar un valor en la URL a través del cual podamos recuperar el registro para renderizarlo. ¿Cuál es ese valor? Pues normalmente será el identificador único del registro (su campo id) al que también se puede acceder con el nombre pk de primary key:

blog/views.py

def post(request):
    post = Post.objects.get(id=?)
    return render(request, "blog/post.html", {'post': post})

Hemos creado la vista y cargaremos el template post.html enviándole el objeto post en el diccionario de contexto, pero nos falta lo más importante, una forma de recuperar el identificador de la entrada.

Esto se maneja en dos partes, primero en la URL definiendo un parámetro:

tutorial/urls.py

from django.contrib import admin
from django.urls import path
from blog.views import home, post

urlpatterns = [
    path('', home),
    path('blog/<id>', post),
    path('admin/', admin.site.urls),
]

Y luego en la vista creando ese parámetro como si formara parte de la función:

blog/views.py

def post(request, id):
    post = Post.objects.get(id=id)
    return render(request, "blog/post.html", {'post': post})

Con esto ya lo tenemos, aunque si accedemos nos dará error de template no encontrado porque todavía no lo hemos creado:

templates/blog/post.html

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{post.title}}</title>
</head>
<body>
    <h1>{{post.title}}</h1>
    <p>{{post.content}}</p>
	<a href="/">Volver a la portada</a>
</body>
</html>

Ya sólo tenemos que añadir un enlace a los títulos para movernos a las entradas:

blog/templates/blog/home.html

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Blog</title>
</head>
<body>
    <h1>Bienvenidos a mi blog</h1>
    <p>Estas son las entradas más recientes.</p>
    {% for post in posts %}
    <div>
        <h2>{{ post.title }}</h2>
        <a href="/blog/{{post.id}}">Leer más</a>
    </div>
    {% endfor %}
</body>
</html>

Nuestra web ahora tendrá tantas páginas como entradas tengamos en el blog pero nosotros solo hemos creado la plantilla base. O lo que es lo mismo, tenemos una web generada dinámicamente a partir de los registros que hay en la base de datos.

Con esto acabamos este proyecto introductorio a Django, espero que os haya gustado y no olvidéis seguirme en Twitter @hektorprofe para no perderos los futuros cursos de la academia.