Skip to content

Django - RSS

Django includes a high-level syndication feed generating framework (django.contrib.syndication) that makes creating RSS and Atom feeds easy. You define a Feed class that describes the content of your feed.

Prerequisites: Ensure 'django.contrib.sites' and 'django.contrib.syndication' are in your INSTALLED_APPS in settings.py, and configure SITE_ID.

Let’s create a feed for the latest blog posts in our application. Assume we have a simple Post model:

myapp/models.py
from django.db import models
from django.urls import reverse
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
def get_absolute_url(self):
# Assuming you have a URL named 'post_detail' that takes a pk
return reverse('post_detail', kwargs={'pk': self.pk})

Now, create a feeds.py file in your app (myapp/feeds.py) and define the feed class:

myapp/feeds.py
from django.contrib.syndication.views import Feed
from django.urls import reverse
from django.utils.feedgenerator import Rss201rev2Feed # Or Atom1Feed
from .models import Post
class LatestPostsFeed(Feed):
# feed_type = Atom1Feed # Uncomment for Atom feed
title = "My Awesome Blog Posts"
link = "/blog/" # Link to the main blog page
description = "Updates on the latest posts on my awesome blog."
def items(self):
"""Returns the list of objects to include in the feed."""
return Post.objects.order_by('-published_date')[:5] # Get latest 5 posts
def item_title(self, item):
"""Returns the title for each item (Post object)."""
return item.title
def item_description(self, item):
"""Returns the description for each item."""
# You might want to truncate or use a summary field here
return item.content
# item_link is only needed if Post model doesn't have get_absolute_url()
# def item_link(self, item):
# """Returns the URL for each item."""
# return reverse('post_detail', args=[item.pk])

Explanation of Feed class attributes/methods:

  • title, link, description: Correspond to the standard feed elements (<channel><title>, <channel><link>, <channel><description> for RSS). The link should ideally be the main URL for the content being syndicated.
  • feed_type: Specifies the feed format (default is RSS 2.0.1). Use Atom1Feed for Atom feeds.
  • items(): Returns an iterable (like a QuerySet) of objects that will become the items in your feed (<item> in RSS).
  • item_title(item), item_description(item): Methods that take an object from items() and return its title and description.
  • item_link(item): Returns the permalink for an item. Important: If your model (like Post above) defines a get_absolute_url() method, Django uses that automatically, and you don’t need to define item_link.
  • Other optional methods exist for authors, publication dates, categories, etc. See Django Syndication Feed Framework Documentation.

Now, connect your Feed class to a URL in your myapp/urls.py:

myapp/urls.py
from django.urls import path
from .feeds import LatestPostsFeed
from . import views # Assuming you have views like PostDetailView
urlpatterns = [
path('latest/feed/', LatestPostsFeed(), name='post_feed'),
# Assuming a detail view for individual posts
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
# ... other app URLs
]

Here, accessing /myapp/latest/feed/ (or whatever URL prefix you use when including myapp.urls in your main urls.py) will generate the RSS feed.

Run your development server and navigate to the feed URL (e.g., http://127.0.0.1:8000/myapp/latest/feed/). Your browser might display it as formatted XML or offer to subscribe with a feed reader.

The output will be an XML document following the RSS (or Atom) specification, containing the feed’s metadata and entries for each item returned by the items() method, with details provided by the item_ methods.

You can then link to this feed URL from your website (e.g., using the standard RSS icon) to allow users to subscribe.