Django模板语法错误

8
我正在跟随一个Django教程,突然当我尝试访问http://127.0.0.1:8000/admin/时,它给了我一个TemplateSyntaxError。
TemplateSyntaxError at /admin/
在渲染时捕获ViewDoesNotExist:尝试在模块polls.views中查找results。错误是:'module'对象没有属性'results'
它突出显示了这一行: {% url 'django-admindocs-docroot' as docsroot %}
管理员页面在我进行教程的第3部分之前完美地工作,但我更改了URL,尽管我按照他们说的方式做了,所以我怀疑这不是问题。 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)

2
请发布您的投票/views.py文件。看起来错误就在那里。 - Timmy O'Mahony
我在views.py中添加了def results,它起作用了,但为什么?Django不能忽略它吗?有些Django的东西有时候就是不合常理。 - Lockhead
嗯,这很有道理。当有人访问URL /polls/1234/results/ 时,函数"results"会从你的views.py中被调用,并将参数id传递给它。然后该函数渲染你的模板并将其返回给用户。这就是Django的工作原理。 - Timmy O'Mahony
但我没有访问结果。 - Lockhead
1
当您将视图放入URLs.py中时,您告诉Django该视图存在。当有人检查网页时,Django会检查所有URL,因此它会寻找该视图(但您尚未创建)。 - Timmy O'Mahony
但是如果我甚至不需要它,只是检查一下,为什么会取消整个页面? - Lockhead
1个回答

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,要么将这些URL注释掉直到需要它们。
从技术上讲,这是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 或其他内容)到函数的缓存以哈希表(字典)的形式构建。这是由此函数构建的:
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)

该函数将评估每个回调函数以检查其是否存在(换行为自己添加)。


谢谢!现在我明白为什么它不只是被忽略了。 - Lockhead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接