Django Sitemap - A quick start guide

In this tutorial, I put together some simple steps to get your Django application sitemap up and running in no time.

1. Enable the "sites" framework:

To use the Django sitemap framework, you first need to enable the "sites" framework:

Edit settings.py and add the following to your INSTALLED_APPS (this will add the sites and sitemap apps):

# settings.py

INSTALLED_APPS = [
    ...    
    'django.contrib.sites',
    'django.contrib.sitemaps',
    ...
]

Add the following to your settings.py to define a SITE_ID:

# settings.py

SITE_ID = 1

Run python manage.py migrate to create the "sites" framework tables.

In Django Admin, access /admin/sites/site/1/ and change the domain to your domain name.

2. Define the get_absolute_url() method in your models

Define the get_absolute_url() method for all the models you have a "view" page that loads an instance of that model (Eg: a single blog post). This will tell Django how to calculate the canonical URL for an object:

# models.py

class Post(models.Model):
    def get_absolute_url(self):
        return reverse('post', args=[self.slug])

3. Create a sitemaps file

Create a file called sitemaps.py in the same directory of your root URLconf file (urls.py).

In sitemaps.py, define the endpoints you want to include in your sitemap. In the following example, I included the endpoints for a blog system:

# sitemaps.py

from django.contrib import sitemaps
from django.urls import reverse
from my_app.models import Post


# This defines the endpoints for single blog posts
class PostSitemap(sitemaps.Sitemap):
    protocol = "https" # optional

    def items(self):
        return Post.objects.all()

    def lastmod(self, obj): # optional
        return obj.published_at


# This defines the endpoints for static pages like the home and about pages
class StaticViewSitemap(sitemaps.Sitemap):
    protocol = "https" # optional

    def items(self):
        return ['home', 'about']

    def location(self, item):
        return reverse(item)


sitemaps = {
    'posts': PostSitemap,
    'static': StaticViewSitemap,
}

4. Change URLconf to activate sitemap generation

Edit your urls.py and make sure that the URLs you want to include in your sitemap have a name.

# urls.py

urlpatterns = [
    path('', home_page, name='home'),
    path('about/', about_page, name='about'),
    path('<slug>/', post_view, name='post'),
]

Include the sitemaps you created in step 3 to your urls.py.

# urls.py

from django.contrib.sitemaps.views import sitemap
from .sitemaps import sitemaps

urlpatterns = [
    path('sitemap.xml', sitemap,
         {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap'),
    path('', home_page, name='home'),
    path('about/', about_page, name='about'),
    path('<slug>/', post_view, name='post'),
]

5. Generate the sitemap

Browse yourwebsite.com/sitemap.xml to generate the sitemap!