例如,我的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文件的优选变体?
答案 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上方。