在django-apps中查找静态文件和模板的顺序

时间:2014-01-09 12:36:32

标签: django

例如,我的django项目中有2个应用程序,模板和具有相同子路径的静态文件:

app1 / 
    static /
        style.css
    templates /
        index.html
app2 / 
    static /
        style.css
    templates /
        index.html

比在settings.py中我添加了这两个应用程序:

INSTALLED_APPS = (
    'app1',
    'app2',
)

现在我在模板中以某种方式使用'style.css'和'index.html',例如

{% include 'index.html' %}

所以,问题是:

Django是否保证当我引用'style.css'或'index.html'时会使用来自app2子目录的文件?

在这种情况下,是否有其他方法可以指出Django文件的优选变体?

1 个答案:

答案 0 :(得分:7)

根据文档,第一场比赛获胜:

  

默认情况下,重复文件名的解析方式与方法类似   模板解析工作原理:首先在其中一个中找到的文件   将使用指定的位置。

https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#django-admin-collectstatic

现在,当你告诉Django收集静态文件或渲染模板时,Django会询问特殊的“finders”,以便在你的configuraiton中为指定的资源定义它们。

静态文件的默认顺序是“FileSystemFinder”,它会在STATICFILES_DIRS中添加它们。如果FileSystemFinder无法在这些目录中找到文件,Django会使用下一个查找程序集,即“AppDirectoriesFinder”,它会在您的应用程序目录中的“静态”子目录中进行搜索。

相同的机制适用于模板。当您告诉Django呈现“index.html”时,它首先要求“filesystem.Loader”在TEMPLATE_DIRS中定义的目录中找到名称相同的模板。如果搜索失败,Django会询问下一个模板加载器“app_directories.Loader”,它在应用程序“templates”子目录中搜索模板目录。

要回答你的问题,因为app1在app2之前注册,Django将使用它的style.css和index.html而不是来自app2的那些。如果您想更改此行为,请将app2放在已安装的应用设置中的app1上方。

文档: https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.app_directories.Loader