Django模板路径

时间:2010-06-14 15:24:49

标签: python django

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

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

我从模板base_template中将admin/base_site.html从Django本身的源代码(django / contrib / admin / templates)中的默认Django管理模板目录中导入到myapp目录的admin子目录中正如教程指示的那样。

由于某种原因似乎没有影响。可能是什么问题的任何线索?我是否必须进行同步数据库?

11 个答案:

答案 0 :(得分:163)

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

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/目录不是你的模板根目录。如果您仍想编写绝对路径,则应该取出对admin模板目录的引用。

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

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

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 :(得分:26)

如果安装使用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',
            ],
        },
    },
]

答案 2 :(得分:7)

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

Official docs.

答案 3 :(得分:7)

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

答案 4 :(得分:5)

本教程的这一部分(使用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或默认:_&#39;声明,应删除。因此,在删除语句之后(就像手册中的示例一样,所有工作都像预期的那样)。

示例手册:

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

与该主题中发布的一些答案相反,添加isDevToolsOpened()无效(这是多余的),因为'DIRS': ['templates']是Django查找模板的默认路径。

如果您尝试引用应用程序的模板,请确保您的应用程序位于主项目templates的{​​{1}}列表中。

INSTALLED_APPS

引用Django的Templates文档:

类DjangoTemplates¶

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

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

在为项目创建应用程序时,应用程序目录内没有settings.py目录。由于您可以在不使用模板的情况下拥有应用程序,因此Django不会创建此类目录。也就是说,您必须创建它并在其中存储模板。

这是Django Tutorial文档中的另一段内容,它更加清晰:

您项目的TEMPLATES设置描述了Django如何加载和呈现模板。默认设置文件配置DjangoTemplates后端,其APP_DIRS选项设置为True。按照惯例,DjangoTemplates在每个INSTALLED_APPS中寻找一个“模板”子目录。

答案 7 :(得分:0)

好吧,假设您有一个全新的项目,如果是这样,您将转到settings.py文件并搜索TEMPLATES,找到后,只需将os.path.join(BASE_DIR, 'template')这一行粘贴到{{ 1}}最后,您应该会得到如下内容:

'DIRS'

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

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

一旦进入外壳:

python3 manage.py shell

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

答案 8 :(得分:0)

在django 2.2中,这里对此进行了说明

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

const routes: Routes = [
  {
    path: 'main',
    component: MainPage,
    children: [
      {
        path: 'tab1',
        loadChildren: '../tab1/tab1.module#Tab1Module'
      },
      {
        path: 'tab2',
        loadChildren: '../tab2/tab2.module#Tab2Module'
      },
      { 
        path: '',   
        redirectTo: '/main/tab1', 
        pathMatch: 'full' 
      }
    ]
  },
  { 
    path: '',   
    redirectTo: '/main/tab1', 
    pathMatch: 'full' 
  }

];

答案 9 :(得分: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',
                ],
            },
        },
    ]

答案 10 :(得分:0)

您可以轻松地在 settings.py 文件夹中添加模板文件夹,os.path 在 django 3.1 中已弃用,因此您可以使用 path 而不是 os.path。你只需要在settings.py中导入path,你必须指定基目录,然后你必须指定模板路径,最后但并非最不重要的是,你必须在TEMPLATES = [{}]中添加模板文件夹路径,对于例子:

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

TEMPLATE_DIR = Path(BASE_DIR, 'templates') (you can name TEMPLATE_DIR to any name)

TEMPLATES = [
{

    'BACKEND': 'django.template.backends.django.DjangoTemplates',

    'DIRS': [TEMPLATE_DIR],

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

        ],
    },
},

]