DEV Community

Cover image for Add RSS Feed to your Django site
Shoukrey Tom
Shoukrey Tom

Posted on

Add RSS Feed to your Django site

you can jump to step 4 if you want to test it with your existing project

Index

1- Intorduction
2- Environment Setup
3- Project Setup
4- Add RSS Feed

Introduction

RSS stands for Really Simple Syndication it allows users and applications to access updates to your website. or simply it informs users or visitors about updates in your website.

Environment Setup

  • create your virtual environment or use an existing one: python -m venv env
  • activate your virtual environment source env/bin/activate
  • install Django pip install django

Project Setup

  • create new folder mkdir django-add-rssfeed && cd django-add-rssfeed
  • create new project django-admin startproject config .
  • create new app python manage.py startapp blog and add it to INSTALLED_APPS
  • edit blog/models.py and paste these code in it:
from django.db import models
from django.urls import reverse

class Post(models.Model):
    STATUS_CHOICES = [('published', 'Published'), ('draft', 'Draft')]
    title = models.CharField(max_length=250)
    content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=12, choices=STATUS_CHOICES, default='draft')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'slug': self.slug})

@receiver(post_save, sender=Post)
def save_slug(sender, instance=None, created=False, **kwargs):
    if created:
        instance.slug = slugify(instance.title)
        instance.save()
Enter fullscreen mode Exit fullscreen mode
  • run python manage.py makemigrations then python manage.py migrate and don't forget to create a superuser python manage.py createsuperuser
  • add Post to admin.py and add some data for testing later.

Add RSS Feed

  • Create a new file blog/feeds.py and put this code in it.
from django.contrib.syndication.views import Feed
from django.utils.feedgenerator import Atom1Feed #optional

from .models import Post

class PostFeed(Feed):
    feed_type = Atom1Feed #optional
    title = "My Blog"
    link = ""
    description = "New Posts of My Blog"

    def items(self):
        return Post.objects.filter(status='published')

    def item_title(self, item):
        return item.title

    def item_description(self, item):
        return truncatewords(item.content, 30) # item.content
Enter fullscreen mode Exit fullscreen mode

items() returns a list of objects that should be included in the feed as <item> elements. and so item_title and item_description are used to return a single object which will be included in <title> and <description> elements.
if you don't have get_absolute_url in your model you must override item_link(self, item) which returns reversed URL.
feed_type is an optional attribute, it is used to change Feed Type, By default, feeds produced by Django use RSS 2.0.

  • and now map it to a blog/urls.py:
from .feeds import PostFeed

urlpatterns = [
    .......
    path("feed/rss", PostFeed(), name="post-feed"),
    ......
]
Enter fullscreen mode Exit fullscreen mode

here is how it looks like:
Alt Text

source code is upload to github: https://github.com/abdulshak1999/Python/tree/main/django/website_rssfeed

for more information check this: https://docs.djangoproject.com/en/3.1/ref/contrib/syndication/

Top comments (0)