Django Global base.html模板

时间:2016-02-06 20:33:56

标签: python django templates

我是Django的新手。我正在使用Django 1.8.6与Python 2.7。我正在尝试使用base.html模板,该模板可以在整个网站中使用全局,每个应用都可以访问它。这是我的测试网站目前的结构:

  

twms

     
    

轮询

         
      

迁移

             

静态

             

模板

    
         

项目

         
      

迁移

             

静态

             

模板

             
        

项目

                 
          

的index.html

        
      
    
         

tmws

         
      

静态

             

模板

             
        

tmws

                 
          

base.html文件

        
      
    
  

以下是project / templates / project / index.html

的代码
{% extends 'tmws/base.html' %}
{% block content %}
    <h1>Projects</h1>
    <ul>
    {% for project in project_list %}
        <li><a href="{% url 'project:detail' project.id %}">{{ project.name }}</a></li>
    {% endfor %}

    </ul>
    end of list
{% endblock %}

这是我收到的错误:

  

/ project /

上的TemplateDoesNotExist      

tmws / base.html文件

如何从我的任何应用访问tmws / tmws / templates / tmws / base.html?

非常感谢任何帮助!

如果需要任何其他信息,请与我们联系。

修改

以下是来自settings.py的模板设置:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),  # If i leave both or just comment one one out I still get the same error
            'tmws.tmws.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',
            ],
        },
    },
]

4 个答案:

答案 0 :(得分:11)

我认为您的模板目录配置可能有问题。在项目的settings.py中尝试检查您是否具有与此类似的配置:

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

'your template dir name'应该是tmws。这将使django在您尝试在HTML中扩展模板时搜索此目录。您可以根据需要添加任意数量的目录。

我想现在Django必须在:

中搜索模板
twms/project/templates/project

所以,如果你把base.html文件放在那里,Django就能找到它。

另一个建议是创建一个通用模板目录并将base.html放在那里,因为您希望它在整个站点中使用。这只是我对订购模板的品味,但它应该以任何一种方式工作。

修改

在settings.py中添加以下内容解决了问题。阅读评论以获取更多信息:

MASTER_BASE_DIR = os.path.dirname(__file__)




TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(MASTER_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 :(得分:0)

检查设置中的TEMPLATES值。您可以将DIR选项添加到可以放置所有常用模板的目录中。

链接:https://docs.djangoproject.com/en/1.9/ref/settings/#templates

答案 2 :(得分:0)

您需要将所有模板文件夹添加到settings.py中的TEMPLATES设置中。然后Django会将它们视为同一个文件夹中的所有内容。好像你没有添加所有这些。您希望您的模板看起来像这样:

TEMPLATES = [
    {
        'DIRS': [
            'twms.tmws.templates',  # Since this is not in an app
        ],
        'APP_DIRS': True,  # Automatically include the templates from INSTALLED_APPS
    },
]

答案 3 :(得分:0)

您可以设置目录以搜索模板,如下所示:

        'DIRS': [os.path.join(MASTER_BASE_DIR, 'templates'),]

它应该在哪里阅读:

        'DIRS': [os.path.join(MASTER_BASE_DIR, 'tmws/templates'),]

为什么呢?因为BASE_DIR的定义如下:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#       -> os.path.dirname(os.path.dirname(/your/path/tmws/tmws/settings.py))
#       -> /your/path/tmws/

所以BASE_DIR指向你的顶级文件夹,如果你用“模板”加入它,它就变成:/your/path/tmws/templates,它不存在。但是,使用DIRS列表中的更改行,它将成为/your/path/tmws/tmws/templates,这是正确的。