Django 1.6: 名称 'sitemaps' 未定义

3 投票
3 回答
2511 浏览
提问于 2025-04-18 16:40

我正在尝试在我的Django应用中实现网站地图,但遇到了以下错误。我正在使用Django网站地图的框架,但我不知道哪里出了问题。

Traceback:
File "mysite/urls.py" in <module>
  3. from sitemap import *
File "mysite/sitemap.py" in <module>
  5. class Sitemap(sitemaps.Sitemap):

Exception Type: NameError at /
Exception Value: name 'sitemaps' is not defined

这是sitemap.py文件

from django.contrib.sitemaps import Sitemap
from meddy1.models import Doctor
import datetime

class Sitemap(Sitemap):
    def __init__(self, names):
        self.names = names

    def items(self):
        return self.names

    def changefreq(self, obj):
        return 'weekly'

    def lastmod(self, obj):
        return datetime.datetime.now()

    def location(self, obj):
        return reverse(obj)


class DoctorSitemap(Sitemap):
    changefreq = "Daily"
    priority = 1

    def items(self):
        return Doctor.objects.all()

    def lastmod(self, obj):
        return obj.date

这是urls.py文件

from django.conf.urls import patterns, include, url
from django.contrib import admin
from sitemap import *

admin.autodiscover()

sitemaps = {
    'pages':Sitemap(['homepage_imprint', 'homepage_archive']),
    'doctor':DoctorSitemap,
    'site':Sitemap(['name_of_url', 'name_of_url']),
}

urlpatterns = patterns('',
    url(r'^', include('meddy1.urls')),
    url(r'^', include('django.contrib.auth.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^sitemap\.xml', include('django.contrib.sitemaps.views.sitemap'),{'sitemaps': sitemaps}), 
)

3 个回答

0

只需要把“sitemap”中的字母“s”改成小写,然后在导入的那一行加上“.views”。所以新的导入语句应该是“from django.contrib.sitemaps.views import sitemap”。

0

Martijn已经给出了正确的答案,我只是想补充一点关于Python命名空间的更一般性说明:你在Python中使用的每一个名字都必须来源于某个地方。有一些内置的名字是始终可以使用的,比如dir()。除了这些内置的名字之外,其他的名字要么是在你自己的代码中创建的,要么是从其他模块或包中导入的:

>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> x = 1
>>> x
1
>>> sys
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined
>>> import sys
>>> sys
<module 'sys' (built-in)>
2

你导入的是 Sitemaps 这个类,而不是整个模块。把模块的名字去掉:

class Sitemap(Sitemap):

这样做基本上是可以的,尽管你在这里替换了导入的类。

另外,还有一种更清晰的方法来说明你在做什么,那就是调整你的模块导入方式。把导入改成:

from django.contrib.sitemaps import Sitemap

改成:

from django.contrib import sitemaps

撰写回答