Создание sitemap в django

В django есть специальные инструменты для создания сайтмапов. Сайтмапы активно используются поисковыми сайтами для индексации страниц. Что такое сайтмап можно посмотреть в википедии.

Перед началом работы добавьте в INSTALLED_APPS в конфигурации приложения следующую строку

INSTALLED_APPS = [     'django.contrib.sitemaps',     # other apps here... ]

Допустим у нас есть модель Page. Должен существовать path где нибудь в url.py с названием page.view

Пусть наше текущее приложение называется main. Тогда добавляем правило в urls.py

path('<slug:slug>/', views.page, name='page.view'), # отображение страницы

Теперь можно создать файл sitemaps.py

from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from page.models import Page


class PageSitemap(Sitemap):
priority = 1

def items(self):
return Page.objects.filter(somefield='somevalue') # получаем все страницы

    

    def location(self, obj): # Возвращает url для каждого объекта
if obj.slug == '-': # используем для главной страницы
return '/'
return reverse('page.view', kwargs={'slug': obj.slug})


sitemaps = {
'page': PageSitemap,
    # другие сайтмапы для других моделей
}

Добавляем также в url.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')]

Теперь сайтмап доступен по адресу /sitemap.xml