Django:静态标签是不可能变成块标签的吗?

Posted

技术标签:

【中文标题】Django:静态标签是不可能变成块标签的吗?【英文标题】:Django : Is it impossible to static tag into block tag? 【发布时间】:2014-05-04 05:28:20 【问题描述】:

下面的代码出错了。我该如何解决这个问题?

% block header %
    <link rel="stylesheet" href="% static 'shop/style.css' %" />
% endblock %

错误输出:

TemplateSyntaxError : 无效的块标签:'static',预期为 'endblock'

【问题讨论】:

你加载了% load staticfiles % 吗? 好的,@nextdoordoc。请您发布您当前的模板结构。 @karthikr 是正确的,即使您的模板继承自 base.html 文件中已经包含 % load static % 标记的文件,这也是必要的 【参考方案1】:

如果您使用的是 Apache,请确保您已将虚拟主机配置为提供静态文件,例如 000-default.conf

<VirtualHost *:80>
    ServerName www.example.com

    ServerAdmin webmaster@localhost

    Alias /static /home/Dev/cfehome/src/static
        <Directory /home/Dev/cfehome/src/static>
           Require all granted
         </Directory>

    <Directory /home/Dev/cfehome/src/cfehome>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess cfehome python-path=/home/Dev/cfehome/src:/home/Dev/cfehome/lib/python3.7/site-packages
    WSGIProcessGroup cfehome
    WSGIScriptAlias / /home/Dev/cfehome/src/cfehome/wsgi.py


    ErrorLog $APACHE_LOG_DIR/error.log
    CustomLog $APACHE_LOG_DIR/access.log combined

</VirtualHost>

【讨论】:

【参考方案2】:

只需将% load static % 添加到模板顶部 % extends 'app/base.html' % 之后。

【讨论】:

这是正确的答案,它解决了问题。它应该被相应地标记。【参考方案3】:

我的解决方案是使用% load static % 和带有静态引用的脚本来include 另一个页面。 % block xxx % 期望第一个 % yyy % 不是 % include %% endblock %(我观察到的唯一案例);因此,当我们使用 "% static 'xxx.js' %" 时,它会中断并抱怨。但是包含另一个页面会让 Django 平静下来。

例如,我有一个页面homepage,它扩展了base.html,并且有一些base.html 中不包含的静态js 文件。

base.html

% block page %

% endblock %
% block script %

% endblock %

homepage.html:

% extends 'base.html' %
% block page %
...
% endblock %
% block script %
    % include 'home_js.html'%  <!-- don't use static links here because Django does not like it. -->
% endblock %

home_js.html:

% load static %
<script src="% static 'scripts/jquery.js' %" ></script>
<script>
    function ...
</script>

现在脚本加载。

因此,在一个块中,除了% block xxx %% endblock % 之外,我们不能使用% % 标签。

我正在使用 Django 5.1。

编辑:

我发现% verbatim %标签在这种情况下是我们的救星。

【讨论】:

【参考方案4】:

是的。 Django 不允许。

您可以使用适当的路径,例如:

<link rel="stylesheet" href="/static/shop/style.css" />

但请注意:如果您更改应用的STATIC_URL,上述href 也必须相应更新。

来自Configuring static files

在您的模板中,或者硬编码像 /static/my_app/example.jpg 这样的 url,或者最好使用静态模板标签...

【讨论】:

【参考方案5】:

1.) 在 settings.py 添加一个 TUPLE :

STATIFILES_DIR = ( os.path.join(BASE_DIR,'assets') , )

2.) 在 urls.py 中添加:

 from django.contrib.staticfiles.urls import staticfiles.urlpatterns
 urlpatterns += staticfile_urlpatterns()

3.) 在您放置 "link rel='stylesheet' .." 的 html 文件中,只需在顶部添加:

% load static from staticfiles %

 and then use :

 <link rel="stylesheet" href="% static 'assets/css' %"

【讨论】:

【参考方案6】:

不,这并非不可能。尝试在同一个 html 文件中包含 % load staticfiles%,而不是尝试从某些 base.html 继承它。

【讨论】:

这是否意味着我必须为每个模板添加这个标签?此属性不会在子模板中继承? 谢谢!我刚刚通过您的回答解决了我的问题! +1 表示解决方案。但它应该包括我们是否在基础中加载静态文件。没有完全理解逻辑虽然 或者你也可以使用% load static %,也可以。

以上是关于Django:静态标签是不可能变成块标签的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Django:您是不是需要使用特定文件夹名称命名标签库(模板、静态等)?

Django:无效的块标签:'static',预期的'endif'

在类模板中专门化非静态成员是不可能的吗?为啥?

Django静态模板标签不显示SVG

Django 1.6.1:静态标签不起作用

Django:静态标签内的变量