Карта сайта Django: у объекта 'module' нет атрибута 'values' - PullRequest
7 голосов
/ 14 февраля 2011

Я следую описанию на http://docs.djangoproject.com/en/1.2/ref/contrib/sitemaps/

I из django.contrib. Файлы Sitemap для импорта добавьте эту строку

(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})

в URLconf

make file 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 ]

9 голосов
/ 23 июля 2011

Я тоже столкнулся с этой проблемой. Между документацией и примерами кода, которые я просматривал, я все еще не мог понять, почему я вижу эту ошибку.

Неправильная документация с моей стороны была от 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}),
)
8 голосов
/ 14 февраля 2011

Вы пропустили шаг - посмотрите на пример в документации .

Вместо импорта модуля sitemaps в ваш urls.py, импортируйте класс BlogSitemap, затем создайте словарь sitemaps:

sitemaps = {'blog': BlogSitemap}
...