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:您是不是需要使用特定文件夹名称命名标签库(模板、静态等)?