A menudo tendrás una aplicación Web impulsada por bases de datos ya funcionando, pero necesitarás agregar un par de páginas estáticas, tales como una página Acerca de o una página de Política de Privacidad. Sería posible usar un servidor Web estándar como por ejemplo Apache para servir esos archivos como archivos HTML planos, pero eso introduce un nivel extra de complejidad en tu aplicación, porque entonces tienes que preocuparte de la configuración de Apache, tienes que preparar el acceso para que tu equipo pueda editar esos archivos, y no puedes sacar provecho del sistema de plantillas de Django para darle estilo a las páginas.
La solución a este problema es la aplicación flatpages de Django, la cual
reside en el paquete django.contrib.flatpages
. Esta aplicación te permite
manejar esas páginas aisladas mediante el sitio de administración de Django, y
te permite especificar plantillas para las mismas usando el sistema de
plantillas de Django. Detrás de escena usa modelos Django, lo que significa que
almacena las páginas en una base de datos, de la misma manera que el resto de
tus datos, y puedes acceder a las flatpages con la API de bases de datos
estándar de Django.
Las flatpages son identificadas por su URL y su sitio. Cuando creas una flatpage, especificas con cual URL está asociada, junto con en qué sitio o sitios está (para más información acerca de sitios, consulta la sección *"Sites").
14.3.1. Usar flatpages
Para instalar la aplicación flatpages, sigue estos pasos:
- Agrega
'django.contrib.flatpages'
a tuINSTALLED_APPS
.django.contrib.flatpages
depende dedjango.contrib.sites
, asique asegúrate de que ambos paquetes se encuentren enINSTALLED_APPS
. - Agrega
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
a tu variable de configuraciónMIDDLEWARE_CLASSES
. - Ejecuta el comando
manage.py syncdb
para instalar las dos tables necesarias en tu base de datos.
La aplicación flatpages crea dos tablas en tu base de datos: django_flatpage
y django_flatpage_sites
. django_flatpage
simplemente mantiene una
correspondencia entre URLs y títulos más contenido de texto.
django_flatpage_sites
es una tabla muchos a muchos que asocia una flatpage
con uno o más sitios.
La aplicación incluye un único modelo FlatPage
, definido en
django/contrib/flatpages/models.py
. El mismo se ve así:
from django.db import models
from django.contrib.sites.models import Site
class FlatPage(models.Model):
url = models.CharField(maxlength=100)
title = models.CharField(maxlength=200)
content = models.TextField()
enable_comments = models.BooleanField()
template_name = models.CharField(maxlength=70, blank=True)
registration_required = models.BooleanField()
sites = models.ManyToManyField(Site)
Examinemos cada uno de los campos:
url
: La URL donde reside esta flatpage, excluyendo el nombre del dominio pero incluyendo la barra (/
) inicial (por ej./about/contact/
).title
: El título de la flatpage. El framework no usa esto para nada en especial. Es tu responsabilidad visualizarlo en tu plantilla.content
: El contenido de la flatpage (por ej. el HTML de la página). El framework no usa esto para nada en especial. Es tu responsabilidad visualizarlo en tu plantilla.enable_comments
: Indica si deben activarse los comentarios e esta flatpage. El framework no usa esto para nada en especial. Puedes comprobar este valor en tu plantilla y mostrar un formulario de comentario si es necesario.template_name
: El nombre de la plantilla a usarse para renderizar esta flatpage. Es opcional; si no se indica o si esta plantilla no existe, el framework usará la plantillaflatpages/default.html
.registration_required
: Indica si se requerirá registro para ver esta flatpage. Esto se integra con el framework de autenticación/usuarios de Django, el cual se trata en el Capítulo 12.sites
: Los sitios en los cuales reside esta flatpage. Esto se integra con el framework sites de Django, el cual se trata en la sección "Sites" en este capítulo.
Puedes crear flatpages ya sea a través de la interfaz de administración de Django o a través de la API de base de datos de Django. Para más información, examina la sección "Agregando, modificando y eliminando flatpages".
Una vez que has creado flatpages, FlatpageFallbackMiddleware
se encarga de
todo el trabajo. Cada vez que cualquier aplicación Django lanza un error, este
middleware verifica como último recurso la base de datos de flatpages en
búsqueda de la URL que se ha requerido. Específicamente busca una flatpage con
la URL en cuestión y con un identificador de sitio que coincida con la variable
de configuración SITE_ID
.
Si encuentra una coincidencia, carga la plantilla de la flatpage, o
flatpages/default.html
si la flatpage no ha especificado una plantilla
personalizada. Le pasa a dicha plantilla una única variable de contexto:
flatpage
, la cual es el objeto flatpage. Usa RequestContext
para
renderizar la plantilla.
Si FlatpageFallbackMiddleware
no encuentra una coincidencia, el proceso de
la petición continúa normalmente.
Nota Este middleware sólo se activa para errores 404 (página no encontrada) — no
para errores 500 (error en servidor) u otras respuestas de error. Nota
también que el orden de MIDDLEWARE_CLASSES
es relevante. Generalmente,
puedes colocar el FlatpageFallbackMiddleware
cerca o en el final de la
lista, debido a que se trata de una opción de último recurso.
14.3.2. Agregar, modificar y eliminar flatpages
Puedes agregar, cambiar y eliminar flatpages de dos maneras:
14.3.2.1. Vía la interfaz de administración
Si has activado la interfaz automática de administración de Django, deberías ver una sección "Flatpages" en la página de índice de la aplicación admin. Edita las flatpages como lo harías con cualquier otro objeto en el sistema.
14.3.2.2. Vía la API Python
Como ya se describió, las flatpages se representan mediante un modelo Django
estándar que reside en django/contrib/flatpages/models.py
. Por lo tanto
puede acceder a objetos flatpage mediante la API de base de datos Django, por
ejemplo:
>>> from django.contrib.flatpages.models import FlatPage
>>> from django.contrib.sites.models import Site
>>> fp = FlatPage(
... url='/about/',
... title='About',
... content='<p>About this site...</p>',
... enable_comments=False,
... template_name='',
... registration_required=False,
... )
>>> fp.save()
>>> fp.sites.add(Site.objects.get(id=1))
>>> FlatPage.objects.get(url='/about/')
<FlatPage: /about/ -- About>
14.3.3. Usar plantillas de flatpages
Por omisión, las flatpages son renderizadas vía la plantilla
flatpages/default.html
, pero puedes cambiar eso para cualquier flatpage con
el campo template_name
en el objeto FlatPage
.
Es tu responsabilidad el crear la plantilla flatpages/default.html
. En tu
directorio de plantillas, crea un directorio flatpages
que contenga un
archivo default.html
.
A las plantillas de flatpages se les pasa una única variable de contexto:
flatpage
, la cual es el objeto flatpage.
Este es un ejemplo de una plantilla flatpages/default.html
:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>