Я тоже столкнулся с этой проблемой. Между документацией и примерами кода, которые я просматривал, я все еще не мог понять, почему я вижу эту ошибку.
Неправильная документация с моей стороны была от https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/:
Может также отображаться на экземпляр класса Sitemap (например, BlogSitemap (some_var)).
Затем я посмотрел на источник Джанго немного ближе. Представление выглядит следующим образом (django.contrib.sitemaps.views.sitemap):
def sitemap(request, sitemaps, section=None, template_name='sitemap.xml'):
maps, urls = [], []
if section is not None:
if section not in sitemaps:
raise Http404("No sitemap available for section: %r" % section)
maps.append(sitemaps[section])
else:
maps = sitemaps.values() # This is where I was seeing the error.
page = request.GET.get("p", 1)
current_site = get_current_site(request)
for site in maps:
try:
if callable(site):
urls.extend(site().get_urls(page=page, site=current_site))
else:
urls.extend(site.get_urls(page=page, site=current_site))
except EmptyPage:
raise Http404("Page %s empty" % page)
except PageNotAnInteger:
raise Http404("No page '%s'" % page)
xml = smart_str(loader.render_to_string(template_name, {'urlset': urls}))
return HttpResponse(xml, mimetype='application/xml')
Затем меня осенило, что параметр sitemaps на самом деле представляет собой словарь ключа для объектов карты сайта, а не сам объект карты сайта. Возможно, это должно было быть очевидно для меня, но мне потребовалось немного времени, чтобы преодолеть мой ментальный блок.
Полный пример кодирования, который я использовал, выглядит следующим образом:
файл sitemap.py:
from django.contrib.sitemaps import Sitemap
from articles.models import Article
class BlogSitemap(Sitemap):
changefreq = "never"
priority = 0.5
def items(self):
return Article.objects.filter(is_active=True)
def lastmod(self, obj):
return obj.publish_date
urls.py file:
from sitemap import BlogSitemap
# a dictionary of sitemaps
sitemaps = {
'blog': BlogSitemap,
}
urlpatterns += patterns ('',
#...<snip out other url patterns>...
(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)