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

Ale*_*sey 4 django

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

app1 / 
    static /
        style.css
    templates /
        index.html
app2 / 
    static /
        style.css
    templates /
        index.html
Run Code Online (Sandbox Code Playgroud)

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

INSTALLED_APPS = (
    'app1',
    'app2',
)
Run Code Online (Sandbox Code Playgroud)

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

{% include 'index.html' %}
Run Code Online (Sandbox Code Playgroud)

所以,问题是:

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

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

Ral*_*lfp 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