Django 模板语法错误

8 投票
1 回答
6369 浏览
提问于 2025-04-16 19:26

我在跟着一个Django的教程,突然当我尝试访问 http://127.0.0.1:8000/admin/ 时,出现了一个TemplateSyntaxError的错误。

错误信息是:在/admin/时出现了TemplateSyntaxError。

在渲染时捕获到ViewDoesNotExist的错误:尝试在模块polls.views中找到结果,结果是:'module'对象没有属性'results'。

错误信息指向了这一行代码:

{% url 'django-admindocs-docroot' as docsroot %}

在我进行到教程的第三部分并修改了网址设置之前,管理页面一直运行得很好,虽然我按照教程的说明来做,所以我不太相信这是问题所在。

这是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)

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 文件中。当你开始写网址并引用那些实际上并不存在的函数时,你会在管理界面外遇到 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.

基本上,这里会创建一个视图映射(网址或其他)到函数的缓存,形式是一个哈希表(字典)。这个缓存是通过这个函数构建的:

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)

这个函数会检查每个回调函数是否存在(换行是我加的)。

撰写回答