Django模板路径

sha*_*tac 82 python django

我正在Windows 7环境中关注http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02上的教程.我的设置文件是:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)
Run Code Online (Sandbox Code Playgroud)

base_templateadmin/base_site.htmlDjango本身的源代码(django/contrib/admin/templates)中的默认Django管理模板目录中获取模板到教程指示的myapp目录的admin子目录中.

它似乎没有因某种原因而生效.可能是什么问题的任何线索?我必须做同步数据库吗?

dig*_*mer 172

我知道这不是在Django教程中,并且对它们感到羞耻,但最好为路径变量设置相对路径.您可以这样设置:

import os

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = PROJECT_PATH + '/media/'

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates/',
)
Run Code Online (Sandbox Code Playgroud)

这样您就可以移动Django项目,并且您的路径根将自动更新.这在您设置生产服务器时很有用.

其次,你的TEMPLATE_DIRS路径有一些可疑之处.它应该指向模板目录的根目录.此外,它也应该以尾随结束/.

我只是猜测这个.../admin/目录不是你的模板根目录.如果您仍想编写绝对路径,则应该取出对admin模板目录的引用.

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/'
)
Run Code Online (Sandbox Code Playgroud)

话虽如此,默认情况下,模板加载器应设置为递归遍历到您的应用程序目录以查找模板文件.

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)
Run Code Online (Sandbox Code Playgroud)

除非您特别想要覆盖某些内容,否则您不需要复制管理模板.

如果尚未运行syncdb,则必须运行它.如果你通过runserver托管django,你还需要静态服务你的媒体文件.

  • 这解决了我的问题.谢谢.但是,默认设置文件的TEMPLATE_DIRS评论说:"不要忘记使用绝对路径,而不是相对路径." 有谁知道该评论的理由? (2认同)
  • 我建议使用`os.path.join`将路径附加到基础目录. (2认同)

Nat*_*anQ 30

如果安装使用Django设置,那么为什么不使用其烘焙的预定义BASE_DIR和TEMPLATES?在pip安装的Django(v1.8)中,我得到:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            BASE_DIR + '/templates/',
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

  • 使用 os.path.join(BASE_DIR, 'templates')` 使路径独立于平台。 (3认同)

小智 9

Django 2.0.3中的智能解决方案,用于将模板保存在项目目录(/root/templates/app_name)中:

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...
Run Code Online (Sandbox Code Playgroud)

在views.py中添加这样的模板路径:

app_name/html_name
Run Code Online (Sandbox Code Playgroud)


Dun*_*xim 7

对于Django 1.6.6:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')
Run Code Online (Sandbox Code Playgroud)

用于调试和生产模式的静态和媒体:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%
Run Code Online (Sandbox Code Playgroud)

进入urls.py你必须添加:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Run Code Online (Sandbox Code Playgroud)

在Django 1.8中,您可以在一个字典(settings.py)中为模板设置模板路径,后端和其他参数:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            path.join(BASE_DIR, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

官方文档.


jpo*_*ppe 6

我也对本教程的这一部分有问题(使用1.7版本的教程).

我的错误是我只编辑了'Django管理'字符串,并没有对手册给予足够的重视.

这是来自django/contrib/admin/templates/admin/base_site.html的行:

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
Run Code Online (Sandbox Code Playgroud)

但经过一段时间和挫折后,很明显有'site_header或default:_'语句,应该删除.因此在删除语句之后(就像手册中的示例一样,所有工作都像预期的那样).

手册示例:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
Run Code Online (Sandbox Code Playgroud)


小智 5

在 django 3.1 中,转到项目设置并导入 os

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)


pet*_*ula 5

与此线程中发布的一些答案相反,添加\'DIRS\': [\'templates\']没有任何效果 - 它是多余的 - 因为这templates是 Django 在每个应用程序中查找模板的默认路径。

\n

如果您尝试引用应用程序的模板,请确保您的应用程序位于INSTALLED_APPS主项目的列表中settings.py

\n
INSTALLED_APPS\': [\n   # ...\n   \'my_app\',\n]\n
Run Code Online (Sandbox Code Playgroud)\n

引用 Django 的模板文档:

\n
\n

类 DjangoTemplates\xc2\xb6

\n

将 BACKEND 设置为 \'django.template.backends.django.DjangoTemplates\' 以配置 Django 模板引擎。

\n

当 APP_DIRS 为 True 时,DjangoTemplates 引擎会在已安装应用程序的templates子目录中查找模板。保留这个通用名称是为了向后兼容。

\n
\n

templates当您为项目创建应用程序时,应用程序目录中没有目录。默认情况下,Django admin 不会为您创建目录。

\n

下面是 Django教程文档中的另一段,更加清晰:

\n
\n

你的project\xe2\x80\x99s TEMPLATES 设置描述了Django 如何加载和渲染模板。默认设置文件配置 DjangoTemplates 后端,其 APP_DIRS 选项设置为 True。按照惯例,DjangoTemplates 在每个 INSTALLED_APPS 中查找 \xe2\x80\x9ctemplates\xe2\x80\x9d 子目录。

\n
\n