我按照http://docs.djangoproject.com/en/1.2/ref/contrib/sitemaps/
上的说明操作我来自django.contrib导入站点地图添加此行
(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})
到URLconf
使用以下内容制作文件sitemap.py:
from django.contrib.sitemaps import Sitemap
from blog.models import Post
class BlogSitemap(Sitemap):
changefreq = 'monthly'
priority = 0.5
def items(self):
return Post.objects.all()
def lastmod(self, obj):
return obj.date
在此地址http://127.0.0.1:8000/sitemap.xml我收到错误消息:
Traceback:
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
100. response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/site-packages/django/contrib/sitemaps/views.py" in sitemap
33. maps = sitemaps.values()
Exception Type: AttributeError at /sitemap.xml
Exception Value: 'module' object has no attribute 'values'
任何人都可以帮助我?
答案 0 :(得分:9)
我也遇到过这个问题。在我看到的文档和代码示例之间,我仍然无法理解为什么我会看到这个错误。
我的误读文件来自https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/:
它也可能映射到Sitemap类的实例(例如,BlogSitemap(some_var))。
然后我更接近地看了一下Django源码。视图如下(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文件:
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}),
)
答案 1 :(得分:8)
你错过了一步 - 看看example in the documentation。
不是在urls.py中导入sitemaps模块,而是导入BlogSitemap
类,然后创建站点地图字典:
sitemaps = {'blog': BlogSitemap}