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 Sitemap
Introduction
A sitemap tells search engines which pages and files you think are important in your site and also provides valuable information about these files.
it helps search engines to crawl your website quickly.
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-sitemap && cd django-add-sitemap - create new project
django-admin startproject config . - create new app
python manage.py startapp blogand add it toINSTALLED_APPS - edit
blog/models.pyand 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()
- run
python manage.py makemigrationsthenpython manage.py migrateand don't forget to create a superuserpython manage.py createsuperuser - add Post to
admin.pyand add some data for testing later.
Add Sitemap
- first add
django.contrib.sitemapstoINSTALLED_APPS - create
blog/sitemaps.pythen paste this code to it:
from django.contrib import sitemaps
from .models import Post
class PostSitemap(sitemaps.Sitemap):
changefreq = "weakly"
priority = 0.8
def items(self):
return Post.objects.filter(status='published')
def lastmod(self, obj):
return obj.updated
changefreq this attribute is used to tell how frequently your site is changing. other values are ["always", "hourly", "daily", "monthly", "yearly", "never"].
you can override default location method if have you don't have get_absolute_url in your model.
- finally, map the URL for the sitemaps in the
config/urls.pyorblog/urls.pyfile.
# config/urls.py
from django.contrib.sitemaps.views import sitemap
from blog.sitemaps import PostSitemap
sitemaps = {
"posts": PostSitemap,
}
urlpatterns = [
..........
path("sitemap.xml", sitemap, {"sitemaps": sitemaps}, name="sitemap"),
.........
]
here is how it looks like in a browser:

source code is upload to github: https://github.com/abdulshak1999/Python/tree/main/django/website_sitemap
for more information check this: https://docs.djangoproject.com/en/3.0/ref/contrib/sitemaps/
Top comments (0)