【问题标题】:How do I fix my Django app's urls.py so I stop getting a TemplateDoesNotExist exception?如何修复我的 Django 应用程序的 urls.py 以停止收到 TemplateDoesNotExist 异常?
【发布时间】:2012-01-21 22:53:56
【问题描述】:

我目前正在关注一个名为A complete blog engine using Django in 60 minutes and am stuck on page 6 的有问题的 Django 教程。所以我有一个名为 blog 的 Django 项目和一个名为 blogengine 的应用程序。目前我在尝试加载时遇到TemplateDoesNotExist 异常

127.0.0.1:8000/blog/

这是完整的回溯:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/blog/

Django Version: 1.3.1
Python Version: 2.7.2
Installed Applications:
['blogengine',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions']
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')

Template Loader Error:
Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
/home/sez/blog/templates/blogengine/post_list.html (File does not exist)
Using loader django.template.loaders.app_directories.Loader:
/usr/local/lib/python2.7/site-packages/django/contrib/admin/templates/blogengine/post_list.html (File does not exist)



Traceback:
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/generic/list_detail.py" in object_list
  107.     t = template_loader.get_template(template_name)
File "/usr/local/lib/python2.7/site-packages/django/template/loader.py" in get_template
  157.     template, origin = find_template(template_name)
File "/usr/local/lib/python2.7/site-packages/django/template/loader.py" in find_template
  138.     raise TemplateDoesNotExist(name)

Exception Type: TemplateDoesNotExist at /blog/
Exception Value: blogengine/post_list.html

Template Loader Error 中你可以看到Django 尝试在/home/sez/blog/templates/blogengine/' directory. To get this working I have to make Django look in the/home/sez/blog/templates/blog/' 目录中寻找post_list.html 模板,但我仍然不完全理解URLconf 是如何作品。

以下是我的 2 个url.py 文件。首先是我的项目级url.py

from django.conf.urls.defaults import patterns, include, url
from django.views.generic.simple import direct_to_template
from blog.views import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
        (r'^admin/', include(admin.site.urls)),
        (r'^static/(.*)$',
            'django.views.static.serve',
            {'document_root': '/home/siddhion/blog/static/'}),
        (r'^(?P<template>\w+)$', direct_to_template),
        (r'^$', static_page, {'template':'base'}),
        (r'^blog/', include('blog.blogengine.urls')),
        url(r'^(?P<template>\w+)/$', static_page, name='static_page'),
        )

据我了解,(r'^blog/', include('blog.blogengine.urls')), 行告诉将控制权重定向到我的blogengine 目录中的url.py 文件。这是该文件的代码

from django.conf.urls.defaults import *
from django.views.generic import list_detail
from blog.blogengine.views import Post

urlpatterns = patterns('',
        url(r'^$',
            list_detail.object_list,
            {
                'queryset': Post.objects.all(),
                'template_object_name':'post',
            },
            name='blog_home'
            ),
    )

那么,为了让 Django 找到并呈现 post_list.html 模板,我必须对我的 urls.py 文件进行哪些编辑?

【问题讨论】:

    标签: django django-templates django-urls urlconf


    【解决方案1】:

    假设文件/home/sez/blog/templates/blog/post_list.html 存在,你只需要告诉Django 去哪里寻找它。显然,它会在 /home/sez/blog/templates/blogengine/ 中查找您的模板。您可以通过调整TEMPLATE_DIRS 中的settings.py 来更改它:

    TEMPLATE_DIRS = (
        # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
        '/home/sez/blog/templates/blog',
    )
    

    但是,将模板子目录命名为它们对应的应用程序是一种常见的做法,因此您可能需要考虑将模板移动到 blogengine,Django 假设它们目前位于此处。

    【讨论】:

      【解决方案2】:

      你可以做两件事,要么通过传入 template_name 参数明确告诉它哪个模板,要么将 post_list.html 移动到 /blog/blog/templates/ 目录,这是 django 将查找它的地方(即使你不在TEMPLATE_DIRS中指定位置)

      来自documentation on generic views

      模板名称:

      如果未指定 template_name,此视图将使用模板 /_list.html 默认。

      【讨论】:

        猜你喜欢
        • 2012-02-08
        • 2012-05-26
        • 1970-01-01
        • 2013-10-08
        • 2020-08-22
        • 1970-01-01
        • 2019-11-04
        • 2010-11-27
        • 1970-01-01
        相关资源
        最近更新 更多