我正在关注Django教程,突然当我尝试访问http://127.0.0.1:8000/admin/时,它给了我一个TemplateSyntaxError。
/ admin /
中的TemplateSyntaxError渲染时捕获ViewDoesNotExist:尝试生成模块polls.views。错误是:'module'对象没有属性'results'
它突出了这一行: {%url'django-admindocs-docroot'as docsroot%}
管理页面就像一个魅力,直到我得到教程的第3部分并且与网址混淆,虽然我的确如此,但我怀疑这是问题。
urls.py:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^polls/$', 'polls.views.index'),
(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail'),
(r'^polls/(?P<poll_id>\d+)/results/$', 'polls.views.results'),
(r'^polls/(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
(r'^admin/', include(admin.site.urls)),
)
admin.py:
from polls.models import Poll
from polls.models import Choice
from django.contrib import admin
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 0
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
list_display = ('question', 'pub_date')
list_filter = ['pub_date']
search_fields = ['question']
date_hierarchy = 'pub_date'
admin.site.register(Poll, PollAdmin)
views.py:
from django.http import HttpResponse
from polls.models import Poll
from django.template import Context, loader
def index(request):
latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
t = loader.get_template('polls/index.html')
c = Context({
'latest_poll_list': latest_poll_list,
})
return HttpResponse(t.render(c))
def detail(request, poll_id):
return HttpResponse("You're looking at poll %s. " % poll_id)
def vote(request, poll_id):
return HttpResponse("You're voting on poll %s." % poll_id)
答案 0 :(得分:15)
Caught ViewDoesNotExist while rendering: Tried results in module polls.views.
Error was: 'module' object has no attribute 'results'
这几乎是你所需要的。忽略TemplateSyntaxError
,它根本与模板无关。 Django告诉你,你没有这个:
def results(request):
# do something
在views.py中。当您开始编写URL并引用其中实际不存在的函数时,您将在管理员之外得到ViewDoesNotExist
个错误,因此请确保在进展时确保您具有仅返回基本的存根函数200,或者在你需要之前将这些网址注释掉。
从技术上讲,这是python错误的扩展。如果你跑了:
$ python manage.py shell
>>> from poll import views
x = views.results
你会得到AttributeError
。
既然你问过为什么,如果你查看Django/core/urlresolvers.py
,你会看到这一行:
_callable_cache = {} # Maps view and url pattern names to their view functions.
因此,基本上,函数的视图映射(url或其他)的缓存是以hashmap(字典)的形式进行的。这是由这个函数构建的:
def _get_callback(self):
if self._callback is not None:
return self._callback
try:
self._callback = get_callable(self._callback_str)
except ImportError, e:
mod_name, _ = get_mod_func(self._callback_str)
raise ViewDoesNotExist("Could not import %s. Error was: %s" % (
mod_name, str(e)))
except AttributeError, e:
mod_name, func_name = get_mod_func(self._callback_str)
raise ViewDoesNotExist("Tried %s in module %s. Error was: %s" % (
func_name, mod_name, str(e)))
return self._callback
callback = property(_get_callback)
评估每个回调以检查它是否存在(换行符是我的)。