【问题标题】:Order of finding static files and templates in django-apps在 django-apps 中查找静态文件和模板的顺序
【发布时间】:2014-01-09 12:36:32
【问题描述】:

例如,我的 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 首选的文件变体?

【问题讨论】:

    标签: django


    【解决方案1】:

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

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

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

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

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

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

    回答你的问题,因为 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

    【讨论】:

    • 谢谢你,拉尔夫。我怀疑 Django 的开发服务器(runserver)以与 collectstatic 命令相同的方式提供静态文件。似乎在某些未定义的行为中发现了静态文件。我将尝试将 runserver 的行为与 collectstatic 的行为进行比较。
    猜你喜欢
    • 2013-08-04
    • 2013-06-18
    • 2012-02-25
    • 2021-05-31
    • 2014-12-10
    • 2011-12-18
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多