【问题标题】:Django : Is it impossible to static tag into block tag?Django:静态标签是不可能变成块标签的吗?
【发布时间】: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 %} 标记的文件,这也是必要的

标签: django static block


【解决方案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 %},也可以。
          猜你喜欢
          • 2016-04-12
          • 2015-04-18
          • 1970-01-01
          • 1970-01-01
          • 2012-09-27
          • 2011-02-09
          • 1970-01-01
          • 2014-02-16
          • 1970-01-01
          相关资源
          最近更新 更多