Django : Is it impossible to static tag into block

2020-02-26 14:05发布

问题:

The code below makes error.. How could I resolve this problem?

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

The error output:

TemplateSyntaxError : Invalid block tag: 'static', expected 'endblock'

回答1:

No, it is not impossible. Try including {% load staticfiles%} in the same html file, rather than attempting to inherit it from some base.html.



回答2:

1.) in settings.py add A TUPLE :

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

2.) in urls.py add :

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

3.) in the html file where you are putting the "link rel='stylesheet' .." , just add at the top :

{% load static from staticfiles %}

 and then use :

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


回答3:

Just add {% load static %} to the top of your template after the {% extends 'app/base.html' %}.



回答4:

My solution is to include another page with {% load static %} and script with static reference. {% block xxx %} expects the first {% yyy %} not to be other than {% include %} and {% endblock %}(the only cases I have observed); so when we use "{% static 'xxx.js' %}" it breaks and complains. But including another page will put Django in calm.

For example, I have a page homepage which extends base.html and has some static js files which are not included in base.html.

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>

Now the scripts loads.

So, in a block we cannot use {% %} tags other than {% block xxx %} and {% endblock %}.

I am using Django 5.1.

EDIT:

I found {% verbatim %} tag to be our savior under such situation.



回答5:

If you are you are using Apache, make sure you have configured the virtual host to serve static files, for example in 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>


回答6:

Yes. Django won't allow it.

You can just use the appropriate path like:

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

But be aware: If you change your app's STATIC_URL, the href above must also be updated accordingly.

From Configuring static files:

In your templates, either hardcode the url like /static/my_app/example.jpg or, preferably, use the static template tag...