Ya os enseñé cómo programar un RSS en Django. Ahora vamos a hacerlo de forma un poco más compleja, pudiendo incluir parámetros en la URL para que las publicaciones en el feed cambien dependiendo de ellos.
####Paso 1: Importamos las clases necesarias
Son las mismas que el tutorial anterior. Se tratan de Feed de Django, del que heredará nuestra clase; Post que es el modelo de nuestras entradas en el blog; Category, que es el parámetro por el que filtraré los Posts y reverse, que no es necesario pero a mí me gusta usarlo.
from django.contrib.syndication.views import Feed
from poster.models import Post
from poster.models import Category
from django.core.urlresolvers import reverse
####Paso 2: Creamos nuestra clase
Creamos una clase que herede de la clase Feed. Sobreescribiremos algunos métodos necesarios para hacer uso de feeds complejos. Os pego el código y luego lo explico:
class PostByCategory(Feed):
def get_object(self, request, category_slug):
return Category.objects.get(slug=category_slug)
def title(self, obj):
return u"AlvaroHurtado.es: Categoría %s" % obj.name
def link(self, obj):
return reverse("one_category", args=[obj.slug])
def description(self, obj):
return obj.meta_description
def items(self, obj):
return obj.post_set.order_by("-publication_date")
def item_link(self, item):
return reverse("one_post", args=[item.slug])
def item_title(self, item):
return item.title
def item_description(self, item):
return item.content
def item_pubdate(self, item):
return item.publication_date
Los métodos title, link y description corresponden con el título, enlace y descripción de cada instancia del feed. Es decir, para cada variación del feed dependiendo de el parámetro establecido. Para generar esos atributos se hace uso del obj que se ha generado con el método get_object que explicaré luego.
Los métodos item_title, item_link, item_description y item_pubdate correspondeon con el título, enlace, descripción y fecha de publicación de cada Post que pasará por el feed.
Ahora los 2 métodos más difíciles:
get_object con los parámetros self, request y category_slug. Este método funciona de forma muy similar a una vista. El parámetro request contiene toda la información de la petición web. El parámetro category_slug es un parámetro definido en la URL del feed. La respuesta del método get_object debe ser un objeto que nos permita generar los elementos vinculados a este feed. En este caso, que vamos a hacer feeds por categoría, utilizo el parámetro category_slug para recuperar de la base de datos la Category correspondiente. El objeto que devolvamos es el que estará disponible en el resto de métodos como obj.
items con los parámetros self y obj. Este método generará el listado de items que estarán disponibles en otros métodos como item. Lo único que hago es recuperar todos los Posts ordenados por fecha de publicación.
####Paso 3: Le asignamos una URL
Es el momento de asignar una URL a nuestro feed.Para ello, importamos la clase que hemos creado anteriormente:
from utility.feeds import PostByCategory
Y asignamos la url que queramos, teniendo en cuenta que tenemos que incluir el parámetro category_slug que indicamos en el método get_object:
url(r'^rss/(?P[a-zA-Z0-9-_]+)/$', PostByCategory(), name="rss_by_category"),
Para comprobar que funciona, aquí os dejo un par de ejemplos que están funcionando en este blog:
http://www.alvarohurtado.es/rss/programacion/.
http://www.alvarohurtado.es/rss/libros/.
… y ya está. Espero que os haya gustado este tutorial.
Hola, gracias por el tutorial … tengo algunas dudas espero no molestar
te he mandado mensaje a tu Instagram
Me gustaMe gusta
No he recibido nada en Instagram. Pregunta por aquí, si lo prefieres.
Me gustaMe gusta