Django has a built in sitemap generation framework that uses views to build a sitemap on the fly. Sometimes your dataset is too large for this to work in a web application. Here is a management command that will generate a static sitemap and index for your models. You can extend it to handle multiple Models.
import os.path from django.core.management.base import BaseCommand, CommandError from django.contrib.sitemaps import GenericSitemap from django.contrib.sites.models import Site from django.template import loader from django.utils.encoding import smart_str from myproject.models import MyModel class Command(BaseCommand): help = """Generates the sitemaps for the site, pass in a output directory """ def handle(self, *args, **options): if len(args) != 1: raise CommandError('You need to specify a output directory') directory = args[0] if not os.path.isdir(directory): raise CommandError('directory %s does not exist' % directory) #modify to meet your needs sitemap = GenericSitemap({'queryset': MyModel.objects.order_by('id'), 'date_field':'modified' }) current_site = Site.objects.get_current() index_files = [] paginator = sitemap.paginator for page_num in range(1, paginator.num_pages+1): filename = 'sitemap_%s.xml' % page_num file_path = os.path.join(directory,filename) index_files.append("http://%s/%s" % (current_site.domain, filename)) print "Generating sitemap %s" % file_path with open(file_path, 'w') as site_mapfile: site_mapfile.write(smart_str(loader.render_to_string('sitemap.xml', {'urlset': sitemap.get_urls(page_num)}))) sitemap_index = os.path.join(directory,'sitemap_index.xml') with open(sitemap_index, 'w') as site_index: print "Generating sitemap_index.xml %s" % sitemap_index site_index.write(loader.render_to_string('sitemap_index.xml', {'sitemaps': index_files}))