带有 css/js 的 Django“包含”模板

Posted

技术标签:

【中文标题】带有 css/js 的 Django“包含”模板【英文标题】:Django 'Include' template with css/js 【发布时间】:2018-01-14 22:39:51 【问题描述】:

我有一个通用模板,用于通过include 标记将html(即menubar.html 中的菜单栏)包含到其他应用模板中。它具有一些已定义的 cssjs 功能,分别存储在 menubar.css|menubar.js 文件中。

menubar.html 文件中包含指向这些文件的链接似乎更方便,如下所示:

//At the Start
<link rel="stylesheet" href="% static '<appname>/css/menubar.css' %" />

//.... other menubar HTML

//At the End
<script src="% static '<app_name>/js/menubar.js' %"></script>

我担心这不是一个好习惯,因为模板将加载不位于 HEADcss 和不位于末尾的 jsBODY。 这些被描述为standard HTML practises。

明确的替代方法是在我包含子模板的每个模板中链接 cssjs,但这似乎很乏味。

我知道还有扩展模板的可能性,但是我相信使用 css/js 也会出现同样的问题。

什么是最好的?

【问题讨论】:

【参考方案1】:

你可以在这里使用 django-sekizai 包:

https://django-sekizai.readthedocs.io/en/latest/

您将有一个基本模板:

% load sekizai_tags %
<!DOCTYPE html>
<html lang="en">
    <head>
        ...
        <!-- other css and head content goes here -->
        % render_block "css" %
    </head>
    <body>
        ...

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
        % render_block "js" %        
    </body>
</html>

然后在您的 menubar.html 中,您可以在模板中的任何位置添加以下内容,它们的 css 将被添加到页面头部,而 javascript 将被添加到正文的底部:

% addtoblock "css" %
    <link rel="stylesheet" href="% static '<appname>/css/menubar.css' %"/>
% endaddtoblock %

% addtoblock "js" %
    <script src="% static '<app_name>/js/menubar.js' %"></script>
% endaddtoblock %

这是一个非常方便的包!

【讨论】:

好建议!这与Template Inheritance 有何不同?我刚刚读到您可以使用% block % 标签并调用 block.super 来获取原始内容。这不会在本地做同样的事情(没有额外的包)吗? 抱歉,我看到了区别 - django 不提供对 processing blocks within includes 的原生支持。我看到 django-sekizai 专门处理这个问题。不错!【参考方案2】:

您可以使用模板继承在 django 中动态加载您的 js 和 css。 This is the reference.

来自this关于javascript加载你使用继承标签的帖子可能如下所示:

#base.html
% block js %
   <script src="% static '<app>/js/resource.js' %"></script>
   ... //other scripts
% endblock %

然后在另一个模板中:

# child.html
% extends base.html %

% block js %
    block.super  //Includes base.html js block content
   <script src="% static '<otherapp>/js/resource2.js' %">
   ... //other scripts
% endblock%

【讨论】:

如果我使用 % include % 标签而不是继承,这看起来如何@gene-sescon?即,我在页面中包含一个 html 资源,但它还需要像页面本身一样扩展 JS 功能。

以上是关于带有 css/js 的 Django“包含”模板的主要内容,如果未能解决你的问题,请参考以下文章

带有 jQ​​uery 的 Django 模板“包含”标签

Django套用现成模板,导入css,js,images等文件

08-Django 模板

Django:在带有前缀的模板中显示表单名称

Django:在基于类的视图中包含媒体(css/js)

Django 模板:翻译带有 HTML 的文本块的最佳实践