En el artículo anterior Django lo hizo un mago creamos un entorno básico con un listado de posts para un blog. En esta ocasión vamos a añadir más funcionalidad.
En concreto, veremos cómo visualizar cada post (lo que llamaremos detalle), y añadiremos paginación.
Pero antes un extra: Añadir elementos aleatorios de pruebas fácilmente con
sampledatahelper.
Descargándose el tag 0.1.0 del repositorio GitHubgit@github.com:magmax/django-blog.git
Viendo los resultados descargándose el tag 0.2.0 del repositorio GitHubgit@github.com:magmax/django-blog.git
Acordáos de crear el entorno Virtualenv e instalar las dependencias.
Y dicho esto, vamos al lío.
Documentos a cholón
Personalmente encuentro bastante fastidioso tener que escribir muchos artículos,
así que vamos a instalarnos una librería llamada sampledatahelper y a configurarla para que nos genere documentos aleatorios.
Instalamos el paquete:
1
(env)$ pip install django-sampledatahelper==0.2.1
Instalamos la aplicación, añadiéndola a la variable INSTALLED_APPS del archivo
app/settings.py, además de la configuración necesaria:
"""
Django settings for app project.
For more information on this file, see
https://docs.djangoproject.com/en/1.6/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.6/ref/settings/
"""# Build paths inside the project like this: os.path.join(BASE_DIR, ...)importosBASE_DIR=os.path.dirname(os.path.dirname(__file__))# Quick-start development settings - unsuitable for production# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!SECRET_KEY='*8l=t4nnb4ns)7d$ckxejxi&i1%5knrwm9+sw6-p4-58q4d(p='# SECURITY WARNING: don't run with debug turned on in production!DEBUG=TrueTEMPLATE_DEBUG=TrueALLOWED_HOSTS=[]# Application definitionINSTALLED_APPS=('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','blog','sampledatahelper',)MIDDLEWARE_CLASSES=('django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',)ROOT_URLCONF='app.urls'WSGI_APPLICATION='app.wsgi.application'# Database# https://docs.djangoproject.com/en/1.6/ref/settings/#databasesDATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':os.path.join(BASE_DIR,'db.sqlite3'),}}# Internationalization# https://docs.djangoproject.com/en/1.6/topics/i18n/LANGUAGE_CODE='en-us'TIME_ZONE='UTC'USE_I18N=TrueUSE_L10N=TrueUSE_TZ=True# Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.6/howto/static-files/STATIC_URL='/static/'TEMPLATE_DIRS=[os.path.join(BASE_DIR,'templates'),]SAMPLEDATAHELPER_MODELS=[{'model':'blog.Post','number':100,},{'model':'blog.Tag','number':5,},]
y ejecutamos:
1
python manage.py sampledatafiller
Y tendremos escritos 100 posts pertenecientes a 5 categorías diferentes. Podéis ejecutar varias veces para generar más o jugar con los parámetros :D
Paginación
Con tantos documentos no hay quien lea nada.
Vamos a paginar. Para ello, editamos nuestro controlador, que en Django se llama vista(archivo blog/views.py):
No creo que tengáis problemas en entenderlo, más allá de encontrar el truco de
magia: Django nos ha inyectado una variable llamada page_obj. Esto es lo que se denomina contexto y que veremos en mayor detalle en el artículo de plantillas y estáticos.
Qué difícil ¿no?
Si os sentís artistas podéis darle un estilillo más chulo. De todas maneras hablaremos más en algún artículo dedicado a las plantillas y estáticos.
Viendo los posts
Ha llegado el momento de ver el contenido de los posts. Esto tiene bastantes modificaciones. Vayamos por partes:
El controlador
No vamos a modificar el modelo, así que vamos directamente con el controlador (archivo blog/views.py, acordaos):
Poco que explicar aquí: importamos django.views.generic.detail.DetailView y creamos una clase de ese tipo, asociándola con nuestro modelo blog.models.Post.
Sólo he añadido una línea, la segunda url. Aquí estoy usando una expresión regular((?P<pk>\d+)) que puede parecer compleja, pero no lo es. Tan sólo cojo uno o más números y le doy un nombre: pk (de primary key). Utilizo esta expresión regular para componer las URLs que identificarán el detalle de un post, asociándolo con la clase que creamos en el paso anterior. Además, le doy un nombre.
Enlazando
Ahora podemos enlazar en la lista de posts, templates/blog/post_list.html: