Django模板路径


87

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

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

base_templateadmin/base_site.htmlDjango本身的源代码(django / contrib / admin / templates)的默认Django admin模板目录中的模板中获取了该模板,并将其按照本教程的说明放入myapp目录的admin子目录中。

由于某种原因,它似乎并没有产生影响。有什么问题的线索吗?我需要做一个同步数据库吗?

Answers:


182

我知道这不是Django教程中的内容,不要为它们感到羞耻,但是最好为您的path变量设置相对路径。您可以这样设置:

import os

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

...

MEDIA_ROOT = PROJECT_PATH + '/media/'

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates/',
)

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

其次,您的TEMPLATE_DIRS路径中有可疑之处。它应该指向模板目录的根目录。同样,它也应该以结尾结尾/

我只是在这里猜测该.../admin/目录不是您的模板根目录。如果仍要编写绝对路径,则应删除对管理模板目录的引用。

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/'
)

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

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
#     'django.template.loaders.eggs.load_template_source',
)

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

如果尚未运行syncdb,则必须运行它。如果您通过runserver托管django,则还需要静态地管理媒体文件。


1
非常感谢您在TEMPLATE_DIRS相对路径的末尾删除了“ / admin”。
shaytac 2010年

1
此建议将模板目录放在项目文件夹中。为了更好的组织,将它放在应用程序的文件夹中是否更有意义?
Sahas Katta

2
这解决了我的问题。谢谢。但是,默认设置文件带有TEMPLATE_DIRS的注释,“不要忘记使用绝对路径,而不是相对路径。” 有人知道该评论的理由吗?
bhekman

1
PROJECT_PATH是项目文件夹的绝对路径。此方法在运行时动态设置绝对媒体路径,因此该值不是硬编码的,并且可以随项目的位置自动更改。这是一个旧帖子,但是您可以使用它来定义项目中任何文件夹或文件的位置。
digitaldreamer

2
我建议使用os.path.join将路径附加到基本目录。
antonagestam '17

34

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

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',
            ],
        },
    },
]

1
这个«BASE_DIR +'/ templates /'»达到了目的。而且看起来也更优雅,而不是单独的部分。
Maxiller

1
使用os.path.join(BASE_DIR, 'templates')的路径是平台无关的。
Abhyudai

10

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],
...

在views.py中只需添加以下模板路径:

app_name/html_name

8

对于Django 1.6.6:

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

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

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%

您必须在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)

在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',
            ],
        },
    },
]

官方文档。


模板路径必须是一个元组:使用此TEMPLATE_DIRS =(os.path.join(BASE_DIR,'templates'),)
renderbox 2015年

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>

但是经过一段时间和无奈之后,很明显有一条'site_header或default:_'语句应该被删除。因此,删除该语句后(就像手册中的示例一样,一切都按预期工作)。

手册示例:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

2

好吧😁假设你有一个全新的项目,如果是这样你会去settings.py文件,然后搜索TEMPLATES,一旦你找到它,你只需粘贴此行os.path.join(BASE_DIR, 'template')'DIRS'最后,你应该得到这样的出头:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        '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',
            ],
        },
    },
]

如果您想知道BASE_DIR目录的位置,请键入以下3个简单命令:

python3 manage.py shell

一旦进入外壳:

>>> from django.conf import settings
>>> settings.BASE_DIR

PS:如果您使用其他名称命名模板文件夹,则也可以在此处进行更改。


1

在django 2.2中对此进行了解释

https://docs.djangoproject.com/en/2.2/howto/overriding-templates/

import os

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

INSTALLED_APPS = [
    ...,
    'blog',
    ...,
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

1

在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',
            ],
        },
    },
]

0

基本上BASE_DIR是您的django项目目录,相同的目录在哪里manage.py

    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',
                ],
            },
        },
    ]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.