Django属性错误:'module'对象没有'rindex'属性

18 投票
4 回答
43292 浏览
提问于 2025-04-16 23:32

我刚开始使用Django,现在才在网上书的第三章。

每次我尝试访问网站时,总是会出现一个奇怪的错误。

错误信息是:在 /test/ 处出现了 AttributeError,意思是 '模块' 对象没有 'rindex' 这个属性。

我的 urls.py 文件内容很简单:

from django.conf.urls.defaults import *
from mysite import hello
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
      ('^test/$',hello),
)

而我的 hello 函数在 mysite 里。

Python 的路径是:

['/home/james/django/mysite', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.6/gtk-2.0', '/home/james/django']

我其实不太明白这是怎么回事。我觉得我可能忽略了什么简单的东西,因为看起来这很直接。当我在 Python 解释器里输入 from mysite import hello 时,并没有报错。

任何帮助都非常感谢。

编辑:

错误追踪信息:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/test/
Django Version: 1.2.3
Python Version: 2.6.6
Installed Applications:
['django.contrib.auth',
 'django.co
 ntrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
     'django.contrib.messages']
    Installed Middleware:
    ('django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py" in get_response
  91.                         request.path_info)
File "/usr/lib/pymodules/python2.6/django/core/urlresolvers.py" in resolve
  217.                     sub_match = pattern.resolve(new_path)
File "/usr/lib/pymodules/python2.6/django/core/urlresolvers.py" in resolve
  123.             return self.callback, args, kwargs
File "/usr/lib/pymodules/python2.6/django/core/urlresolvers.py" in _get_callback
  134.             mod_name, func_name = get_mod_func(self._callback_str)
File "/usr/lib/pymodules/python2.6/django/core/urlresolvers.py" in get_mod_func
  78.         dot = callback.rindex('.')

Exception Type: AttributeError at /test/
Exception Value: 'module' object has no attribute 'rindex'

hello 函数的内容是:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

4 个回答

4

网址模式应该是字符串的元组,而不是一个模块。像这样:

urlpatterns = patterns('',
      ('^test/$','hello.views.hello'), 
)

补充说明:你也可以把一个可调用的对象传给模式。我之前从没见过这样做(文档里总是用字符串)。不过,你实际上是传了一个模块,而不是字符串或可调用对象(所以Django会搞混,先把它当成可调用对象处理,因为它不是字符串,但又回过头来试图把它当成字符串,因此调用了rindex)。也许你是想传hello.views.hello,像这样:

urlpatterns = patterns('',
      ('^test/$',hello.views.hello), 
)

另外,你可以把导入的那一行改成from mysite.hello.views import hello,或者直接使用字符串语法(我相信'hello.views.hello'这样也可以,正如最开始建议的那样)。

5

我在添加一个基于类的视图时遇到了这个错误:

url(r'^tv/$', views.MyTemplateView(), name='my_tv'),

当然,为了解决错误 object has no attribute 'rindex',应该加上 .as_view()

url(r'^tv/$', views.MyTemplateView.as_view(), name='my_tv'),
16

你可能需要把

from mysite import hello

改成类似这样的

from mysite.hello_file import hello_view

然后使用:

('^test/$',hello_view)

因为你需要传递一个(视图)函数,而不是一个文件或模块。我觉得mgalgs想要解释这个,但对初学者来说有点不太清楚。

撰写回答