検索エンジンに正しくクロールしてもらうために、Django が標準機能でサイトマップを生成する方法を整理します。
使うのはdjango.contrib.sitemaps です。
Django側の準備から、サイトマップクラスの作成、URL ルーティングまでの流れをまとめた実装メモです。
Djangoでサイトマップ(sitemap.xml)を実装する方法まとめ
1. django.contrib.sitemaps を有効化する
まずは Django の設定。
INSTALLED_APPS = [
# 既存アプリ
"django.contrib.sitemaps",
]これでサイトマップ機能が利用可能になります。
2. サイトマップクラスを作成する
サイトマップに含めたい URL を定義するためのクラスを作ります。app_name/sitemaps.py のように専用ファイルを切っておくと管理しやすいです。
2-1. モデルベースのサイトマップ
更新頻度や優先度は適宜調整します。
from django.contrib.sitemaps import Sitemap
from .models import Article # 任意のモデル
class ArticleSitemap(Sitemap):
changefreq = "weekly"
priority = 0.8
def items(self):
# 公開済みデータを対象にする
return Article.objects.filter(is_published=True).order_by("-updated_at")
def location(self, obj):
return obj.get_absolute_url()
def lastmod(self, obj):
return obj.updated_atitems() で返したオブジェクトが、サイトマップに展開されます。
2-2. 静的ページ用サイトマップ
トップページやプライバシーポリシーなど、モデルを持たない URL をまとめたいときに使います。
from django.contrib.sitemaps import Sitemap
from django.urls import reverse
class StaticViewSitemap(Sitemap):
changefreq = "monthly"
priority = 0.5
def items(self):
return ["index", "search", "privacy_policy"] # URL 名
def location(self, item):
return reverse(item)URL 名(name="...")を返すと、自動で実 URL に変換されます。
3. URL に sitemap.xml を登録する
core/urls.py にサイトマップを紐づけます。
from django.contrib.sitemaps.views import sitemap
from app_name.sitemaps import ArticleSitemap, StaticViewSitemap
sitemaps = {
"articles": ArticleSitemap,
"static": StaticViewSitemap,
}urlpatterns = [
# 既存のURLパターン…
path(
"sitemap.xml",
sitemap,
{"sitemaps": sitemaps},
name="sitemap",
),
]これで /sitemap.xml にアクセスすると、XML形式で URL 一覧が出力されます。
4. 動作確認
実装後に確認した内容は次の通り。
- リンターエラーがないか
/sitemap.xmlにアクセスして意図した URL が含まれているか- 非公開データが混ざっていないか
lastmodが正しい値になっているか
特にモデルベースのサイトマップは、対象条件の絞り込み漏れに注意。
サイトマップを分割したい場合(sitemap-index.xml を使う)
Django では、サイトマップを複数ファイルに分割して「サイトマップインデックス(sitemap-index.xml)」として管理できます。
URL 数が増えてきたり、用途別に整理したくなった場合に便利な仕組みです。
サイトマップを分割する必要があるケース
サイトマップ分割の必要性は、次のいずれかを満たすときに検討します。
1. URL が 50,000 件を超える場合
Google の仕様上、1つの sitemap.xml は 最大 50,000 URL。
これを超える規模のコンテンツを扱う場合は、物理的に分割が必須。
- 大規模ブログ
- ECサイトの商品ページ
- 動的に生成される大量のページを持つサイトなどで発生しやすいケース。
2. XML のサイズが 50MB を超える場合
サイトマップは「圧縮後で 50MB 以下」という制限があります。
画像タグ(<image:image>)を大量に含む場合など、サイズ制限で分割が必要になるケース。
3. コンテンツの用途が明確に分かれている場合
URL 上限以下でも、構造上の整理目的で分割する例も多いです。
例:
- ブログ記事 sitemap
- 商品ページ sitemap
- 静的ページ sitemap
管理しやすく、Search Console 上でカバレッジの把握もしやすくなります。
4. Search Console で用途別にクロール状態を可視化したい場合
「ブログだけエラーが出てる」など、問題を切り分けたいときに便利。
サイトマップを分けることで原因の特定が容易になります。
Djangoでサイトマップを分割する実装方法
Django は sitemap ビューに複数の Sitemap クラスを渡すだけで、
自動的に サイトマップインデックス として扱ってくれます。
下記のように、用途別に Sitemap クラスを増やして分割します。
ステップ1:用途別の Sitemap クラスを作る
例として、ブログ・商品・静的ページの3種類を用意します。
# app/sitemaps.py
from django.contrib.sitemaps import Sitemap
from django.urls import reverse
from .models import BlogPost, Product
class BlogSitemap(Sitemap):
changefreq = "weekly"
priority = 0.8
def items(self):
return BlogPost.objects.filter(published=True)
def lastmod(self, obj):
return obj.updated_at
class ProductSitemap(Sitemap):
changefreq = "daily"
priority = 0.9
def items(self):
return Product.objects.filter(is_active=True)
def lastmod(self, obj):
return obj.updated_at
class StaticViewSitemap(Sitemap):
changefreq = "monthly"
priority = 0.5
def items(self):
return ["index", "privacy_policy"]
def location(self, item):
return reverse(item)ステップ2:sitemaps 辞書でまとめる
# core/urls.py
from django.contrib.sitemaps.views import sitemap
from app.sitemaps import BlogSitemap, ProductSitemap, StaticViewSitemap
sitemaps = {
"blog": BlogSitemap,
"products": ProductSitemap,
"static": StaticViewSitemap,
}ここでキー名がそのまま/sitemap-blog.xml/sitemap-products.xml/sitemap-static.xml
といったサブサイトマップの名前になります。
ステップ3:URL に sitemap.xml(インデックス)を登録する
urlpatterns = [
path(
"sitemap.xml",
sitemap,
{"sitemaps": sitemaps},
name="sitemap"
),
]これだけで Django が自動的に以下を生成します:
| URL | 役割 |
|---|---|
/sitemap.xml | サイトマップのインデックス(sitemap-index.xml 相当) |
/sitemap-blog.xml | ブログ記事専用のサイトマップ |
/sitemap-products.xml | 商品ページ専用のサイトマップ |
/sitemap-static.xml | 静的ページ専用のサイトマップ |
ステップ4:Search Console にインデックスのみ登録する
Google Search Console で登録するのは /sitemap.xml(インデックス)だけでOK。
Google が各サブサイトマップを自動で取得してくれます。
https://example.com/sitemap.xmlまとめ
Django のサイトマップ機能は、最小限のコードで sitemap.xml を自動生成できるのが便利です。
- モデルごとに Sitemap クラスを定義
- 静的ページは URL 名をまとめて Sitemap 化
sitemap.xmlにまとめて登録
この3つを押さえておけば、複数ページを持つサイトでも簡単にサイトマップを運用できます。

コメント