Django sitemap:'module'对象没有属性'values'

时间:2011-02-14 19:02:55

标签: django sitemap

我按照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'

任何人都可以帮助我?

2 个答案:

答案 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}