【问题标题】:Template loading locations模板加载位置
【发布时间】:2012-10-01 23:49:12
【问题描述】:

我是 django 的新手,通过做小应用程序来学习。 在views.py中,我故意包含了一个不存在的模板文件(.html)。

t = get_template('current_datetimeP.html')

在setting.py中 模板目录 = ( "D:/Django_Code/mysite/templates/", )

我在 /time/

收到此错误 TemplateDoesNotExist

Django 尝试按以下顺序加载这些模板: 使用加载器 django.template.loaders.filesystem.Loader: D:\Django_Code\mysite\templates\current_datetimeP.html(文件不存在)

因为我已经在 settings.py 中包含了 D:\Django_Code\mysite\templates\ ,所以 Django 很好,但是接下来呢

我也明白了

使用加载器 django.template.loaders.app_directories.Loader: C:\Python27\lib\site-packages\django\contrib\auth\templates\current_datetimeP.html(文件不存在)

为什么 Django 在这里查看 *C:\Python27\lib\site-packages\django\contrib\auth\templates*。 它是搜索模板的默认位置吗?

还有一件事,很明显 Django 正在查看上面的目录。我们可以将模板文件放在那里而不是放在应用程序目录中吗? (虽然这不是一个好习惯)?

【问题讨论】:

    标签: django


    【解决方案1】:

    模板加载由 settings.py 中的 TEMPLATE_LOADERS 设置控制,通常看起来像这样:

    TEMPLATE_LOADERS = (
        'django.template.loaders.app_directories.Loader',
        'django.template.loaders.filesystem.Loader',
    )
    

    应用程序目录加载器在设置中 INSTALLED_APPS 中列出的任何应用程序的“模板”文件夹中查找模板。

    文件系统加载器尝试从设置文件中 TEMPLATE_DIRS 下列出的完全限定目录路径名加载模板。

    如果您希望提供文件系统加载器首选项,请将其放在 TEMPLATE_LOADERS 设置中的应用程序目录加载器之前。如果您想关闭应用目录加载,请使用 # 将其注释掉(或将其从元组中删除)。

    【讨论】:

    • 好的。但为什么它停在 auth ?还安装了其他应用程序,例如 'django.contrib.contenttypes'、django.contrib.sessions 等。为什么不看这些?
    • 它按照 INSTALLED_APPS 中定义的顺序遍历已安装的应用程序。你能检查一下 auth 是在 django.contrib.contenttypes 之后还是相反?
    • 我的意思是,如果在 A 位置找不到它,那么它不应该在 B 位置、C 位置等处寻找
    • 某些应用程序(例如会话和内容类型)不包含模板文件夹。我相信应用程序模板目录列表在 django 应用程序启动时会被缓存,因此不会在后续请求中检查这些应用程序。
    【解决方案2】:

    尝试使用使用 settings.py 位置创建的模板路径

    import os
    DIRNAME = os.path.dirname(__file__)
    TEMPLATE_DIRS = (
        os.path.join(DIRNAME, "templates"),
    )
    
    
    TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    )
    

    【讨论】:

    • D:\Django_Code\mysite\templates\mytemp.html(Windows)。 DIRNAME = ?
    • TEMPLATE_DIRS = ( # 把字符串放在这里,比如 "/home/html/django_templates"。# Always use forward slashes, even on Windows.os.path.join(DIRNAME, "templates"), )
    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2015-06-09
    • 2014-09-15
    • 2018-11-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多