Ошибка атрибута Django. Объект 'module' не имеет атрибута 'rindex'
Я только начал использовать django, только в главе 3 онлайн-книги.
Я продолжаю получать эту странную ошибку при попытке доступа к сайту.
AttributeError at/test/
Объект 'module' не имеет атрибута 'rindex'
my 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']
Я действительно не понимаю, что здесь происходит. Я предполагаю, что я пропускаю что-то глупое, потому что это кажется таким простым. Когда я делаю из mysite hello в интерпретаторе python, он не вызывает никаких ошибок.
любая помощь будет большой
изменить:
отслеживающий
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'
Привет-функция
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world")
Ответы
Ответ 1
Вероятно, вам нужно изменить
from mysite import hello
к чему-то вроде
from mysite.hello_file import hello_view
И затем используйте:
('^test/$',hello_view)
Потому что вам нужно передать функцию (view), а не файл или модуль. Как я думаю, mgalgs пытался объяснить, но я думаю, что немного непонятно для новичков.
Ответ 2
Шаблон url должен быть кортежами строк, а не модулем. Что-то вроде:
urlpatterns = patterns('',
('^test/$','hello.views.hello'),
)
EDIT: вы также можете передавать шаблоны. Я просто никогда раньше не видел, чтобы это делалось раньше (документы всегда передают строку). Тем не менее, вы фактически передаете модуль, а не строку или вызываемый (поэтому django запутывается и сначала относится к нему так, как будто он должен быть вызываемым, поскольку он не является строкой, а затем возвращается к пытается обработать его как строку, следовательно, вызов rindex
). Возможно, вы хотели передать hello.views.hello
так:
urlpatterns = patterns('',
('^test/$',hello.views.hello),
)
В качестве альтернативы вы можете изменить строку импорта на from mysite.hello.views import hello
или просто использовать синтаксис строки (я считаю, что 'hello.views.hello'
сделал бы это, как первоначально предполагалось).
Ответ 3
Я получил эту ошибку при добавлении класса на основе вида следующим образом:
url(r'^tv/$', views.MyTemplateView(), name='my_tv'),
конечно .as_view()
следует добавить для исправления ошибки object has no attribute 'rindex'
:
url(r'^tv/$', views.MyTemplateView.as_view(), name='my_tv'),
Ответ 4
Попробуйте это
urlpatterns = patterns('',
('r^test/$','hello.views.hello'), )