【问题标题】:Django Template Not Found找不到 Django 模板
【发布时间】:2015-03-14 10:36:10
【问题描述】:

我有一个 Django 问题,它只是偶尔会在查找模板时遇到问题。它将运行好几个小时,然后突然无法提供某些模板。有时问题会自行纠正,但总是可以通过运行touch <template> 来解决。我目前的解决方案是一个 cronjob,它每分钟执行一次touch <project root>,只要 cron 跟上它就可以工作。但是,我想找出一个合适的解决方案来解决我的问题。

相关设置:

PROJECT_ROOT = os.path.dirname(__file__)
APPS_ROOT = os.path.abspath(os.path.join(PROJECT_ROOT, "apps"))

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)
TEMPLATE_DIRS = (
    (PROJECT_ROOT + '/templates'),
)
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.request",
    "django.core.context_processors.i18n",
    "django.contrib.messages.context_processors.messages",
    "base_site.context_processors.app_list"
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

【问题讨论】:

  • 您的设置中有静态文件查找器吗? STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', # 'django.contrib.staticfiles.finders.DefaultStorageFinder', )
  • 尝试在 app 目录中添加一个名为“templates”的文件夹,而不是在 project_root 目录中。如果可行,则运行“manage.py collectstatics”将所有应用静态文件归为一个
  • 我不认为问题出在静态文件上?问题是 django 抛出 TemplateDoesNotExist,并详细说明 django 无法在 <project_root>/templates/admin/.../<template file>.html 找到模板,即使该文件存在。我在管理员中修改页面的大多数模板,我的理解是把它们放在项目根目录下是 django 找到正确模板的唯一方法?
  • @Astraub 你正在用你自己的覆盖默认模板目录,所以现在它只会搜索应用程序目录(而不是项目目录)你知道吗?但是管理模板只能放在项目目录中。 !
  • 我尝试将管理模板添加到 PROJECT_ROOT/apps 内的应用程序中无济于事,django 仍然抛出 TemplateDoesNotExist 列出应用程序中的模板和 PROJECT_ROOT/templates 中的模板作为文件检查。

标签: python django django-templates django-admin


【解决方案1】:

只是想添加另一个可能出现Template Does Not Exist 错误的情况。

确保您已将应用添加到 settings.py 文件中的 INSTALLED_APPS 变量中。 startapp 命令是不够的。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myappname', # add your app here :)
]

我知道这很愚蠢,但我知道有些人因为忘记系安全带而未能通过驾驶考试,所以忘记一行代码并不像听起来那么罕见。

【讨论】:

    【解决方案2】:

    尝试像这样更新您的设置:

    PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, 'templates'),)
    

    (这是在 django 1.8 中获取 BASE_DIR 的默认方式)。在 Python 3.4 之前,__file__ 不保证给出绝对文件路径。

    您还应该尝试通过使用 os.path.join 而不是将目录添加为字符串(其他平台使用反斜杠)来保持与平台无关。

    【讨论】:

      【解决方案3】:

      原来我的问题不在于 Django 本身,而在于我的环境。我从 ~/Django-project 运行 Django 服务器,一旦所有会话都注销,我们的开发服务器就会加密主目录,这意味着服务无法再找到它。将项目移动到 /var/ 并守护进程 manage.py runserver 命令使项目没有模板不存在错误。

      【讨论】:

      • 这听起来像是一个痛苦且容易出错的系统架构
      猜你喜欢
      • 2018-01-02
      • 2012-07-10
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      相关资源
      最近更新 更多