Зачем нужны карта сайта и лента

Поисковый робот ходит по ссылкам, поэтому глубокие и новые страницы находятся не сразу. sitemap.xml — явный список URL. RSS/Atom-лента отдаёт тот же контент в машиночитаемом виде. Всё это в Django даёт django.contrib.

Робот находит sitemap.xml через robots.txt
Робот находит sitemap.xml через robots.txt
ИнструментАдресДля кого
Sitemap/sitemap.xmlпоисковые роботы
Feed/feeds/rss/читалки и агрегаторы
robots.txt/robots.txtвсе роботы

Настройка

Добавьте в INSTALLED_APPS приложения django.contrib.sites, django.contrib.sitemaps и django.contrib.syndication, задайте SITE_ID = 1. Без sites Django использует хост текущего запроса, но с sites домен хранится в одном месте.

python
# settings.py
INSTALLED_APPS = [
    # ...
    "django.contrib.sites",
    "django.contrib.sitemaps",
    "django.contrib.syndication",
    "blog",
]

SITE_ID = 1

⚠️ После migrate запись Site по умолчанию — example.com. Замените её на реальный домен в админке или shell: Site.objects.update(domain="example.org", name="Example").

Класс Sitemap

У модели должен быть get_absolute_url(). Метод items() у Sitemap отдаёт объекты, lastmod() — дату изменения.

python
# blog/models.py
from django.db import models
from django.urls import reverse

class Post(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    body = models.TextField()
    published = models.BooleanField(default=False)
    published_at = models.DateTimeField(null=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True)

    def get_absolute_url(self):
        return reverse("blog:post-detail", kwargs={"slug": self.slug})
python
# blog/sitemaps.py
from django.contrib.sitemaps import Sitemap
from django.urls import reverse

from .models import Post

class PostSitemap(Sitemap):
    changefreq = "weekly"
    priority = 0.8
    protocol = "https"