Antonio Melé

Django 2


Скачать книгу

alt="Illustration"/>

      {% load static %} le indica a Django que cargue la plantilla static, contenida en la aplicación django.contrib.staticfiles, el cual está definido en la variable de configuración INSTALLED_APPS. Tras cargarla, se puede utilizar el filtro {% static %} en la plantilla, el cual permite cargar contenido estático, como el fichero blog.css, alojado bajo el directorio static/ de la aplicación blog. Copie el directorio static/ del código disponible para este capítulo en la misma localización del proyecto para aplicar las hojas de estilo CSS.

      También se pueden ver dos etiquetas {% block %}. Estas definen una región a Django. Las plantillas que heredan de esta plantilla base pueden incluir contenido dentro de estos bloques. Se han definido dos bloques, uno llamado title y otro content.

      Edite el fichero post/list.html con el siguiente código:

Illustration

      Con la etiqueta {% extends %} se indica a Django que herede de la plantilla blog/base.html. De este modo, se puede redefinir el contenido de los bloques title y content de la plantilla base con otro contenido. Para esto se iteran sobre los artículos y se muestra: su título, fecha de publicación, autor y contenido, incluyendo el enlace canónico al artículo en el título. En el contenido se aplican dos filtros: truncatewords, que trunca el valor a un número específico de caracteres, y linebreaks, que convierte la salida en saltos de línea de HTML. Se pueden concatenar tantos filtros como quiera, donde cada uno será aplicado con la salida generada por el filtro anterior.

      Abra el intérprete y ejecute el comando python manage.py runserver para arrancar el servidor de desarrollo. Abra en el navegador http://127.0.0.1:8000/blog/ y verá corriendo la aplicación. Recuerde que necesita algún artículo en el estado published para que pueda verlos aquí. El aspecto debería ser:

Illustration

      Ahora se va a editar el fichero post/detail.html:

Illustration

      Tras editarlo, se puede volver al navegador y pulsar sobre el enlace del título para acceder a la vista de detalle. Debería aparecer:

Illustration

      Si mira a la URL, verá /blog/2017/12/14/who-was-django-reinhardt/. Se han diseñado URLs para el artículo aptas para SEO.

      En el momento en el que empiece a añadir contenido a el blog, pronto se dará cuenta de que es necesario dividir el listado de artículos en diferentes páginas. Django trae ya una clase capaz de realiza esta paginación. Modifique la vista post_list del fichero views.py de la aplicación blog del siguiente modo:

Illustration

      Así es como funciona la paginación:

      1. Se instancia un objeto de la clase Paginator con el número de objetos que queremos visualizar en cada página.

      2. Se obtiene el parámetro GET page que indica la página actual que se va a mostrar.

      3. Se obtienen los objetos adecuados a mostrar según la página llamando al método page() de Paginator.

      4. Si el parámetro page no es un entero, obtiene la primera página del listado. Si el número es mayor que la última página de resultados, obtendrá la última página.

      5. Pasa el número de página y el subconjunto de artículos a la plantilla.

      Ahora hay que crear una plantilla que muestre el paginador, de modo que pueda ser incluido en cualquier plantilla que lo necesite. Se va a crear una nueva plantilla dentro del directorio templates/ de la aplicación blog, añadiendo el siguiente contenido:

Illustration

      La plantilla del paginador espera un objeto Page para poder visualizar información de la página actual, el número total de páginas y los enlaces de página siguiente y anterior. Se vuelve a la plantilla blog/post/list.html para incluir la plantilla pagination.html al final del bloque {% content %}, del siguiente modo:

Illustration

      Dado que la plantilla de paginación hace uso de la variable page para paginar, así relaciona dicha variable con la que contiene los artículos en el listado de artículos. De este modo se puede reutilizar la plantilla de paginación para cualquier otro modelo.

      Si va al navegador y visita http://127.0.0.1:8000/blog/, debería ver la paginación al final del listado de artículos y los enlaces de navegación.

Illustration

      Las vistas de tipo basadas en clase son una alternativa para implementar vistas como objetos Python en vez de funciones. Mientras que una vista es un elemento al que se puede llamar y que toma una solicitud web y devuelve una respuesta, también se pueden definir vistas como métodos de clase. Django aporta clases base para poder hacerlo de forma sencilla. Todas ellas heredan de la clase View, la cual interactúa con el envío y recepción de contenido HTTP y otras funcionalidades comunes.

      Las vistas basadas en clase ofrecen algunas ventajas frente a las vistas de función:

      • Permiten organizar el código según métodos HTTP, como GET, POST o PUT, en métodos de clase separados, en vez de usar sentencias condicionales.

      • Permiten utilizar herencia múltiple para crear vistas reutilizables (también conocidas como mixins).

      Para obtener más información, la documentación de Django ofrece una introducción a las vistas basadas en clase en https://docs.djangoproject.com/en/2.0/topics/class-based-views/intro/.

      Se va a cambiar la vista post_list para que funcione como una vista basada en clase usando la clase ListView de Django. Esta clase permite listas de objetos de cualquier tipo.

      Edite el fichero views.py de la aplicación blog y añada las siguientes líneas:

Illustration

      Esta vista basada en clase es análoga a la vista previa post_list. En el código anterior ha especificado a ListView lo siguiente:

      • Utiliza un QuerySet específico en vez de utilizar el que devuelve todos los objetos. En vez de definir el atributo queryset, podría haber especificado model = Post y Django hubiera construido el QuerySet genérico Post.objects.all() por usted.

      • El nombre de la variable de contexto que contiene todos los elementos es posts. Si no se especifica nada, el nombre por defecto es object_list.

      • Que cada página contenga tres elementos.

      • La plantilla que debe utilizar para renderizar la página, sino ListView utilizará la plantilla por defecto blog/post_list.html.

      Queda por modificar el fichero urls.py de la aplicación blog. Comente el patrón de post_list y añada un nuevo patrón de URL para la clase PostListView del siguiente modo: