eugene
eugene

Reputation: 41765

include static files from django template

I'm trying to include a static html page from a django template.

I tried using {% include the_static.html %} but this doesn't work for some unknown reason.

the_static.html page is a data page that will be modified often with an html editor.
and my_model has a url to this html and include it. But django refuses to find it although I'm sure I've setup the path correctly.

Upvotes: 5

Views: 6528

Answers (4)

Keith
Keith

Reputation: 807

Sort of resurrecting the dead, but at least with django 1.10, there's a very clean answer here: http://www.effectivedjango.com/tutorial/static.html

an excerpt from that page:

Simple Template Inclusion We want to add the Boostrap CSS to all of our templates, but we’d like to avoid repeating ourself: if we add it to each template individually, when we want to make changes (for example, to add another stylesheet) we have to make them to all the files. To solve this, we’ll create a base template that the others will inherit from.

Let’s create base.html in the templates directory of our contacts app.

{% load staticfiles %}
<html>
  <head>
    <link href="{% static 'bootstrap/css/bootstrap.min.css' %}"
          rel="stylesheet" media="screen">
  </head>

  <body>
    {% block content %}
    {% endblock %}

    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
  </body>
</html>

base.html defines the common structure for our pages, and includes a block tag, which other templates can fill in.

We’ll update contact_list.html to extend from base.html and fill in the content block.

{% extends "base.html" %}

{% block content %}
<h1>Contacts</h1>

<ul>
  {% for contact in object_list %}
    <li class="contact">{{ contact }}</li>
  {% endfor %}
</ul>

<a href="{% url "contacts-new" %}">add contact</a>
{% endblock %}

Having followed this exactly, I now have a base.html that includes all my style references and the navigation bars/etc, so the html in the block content is merely the central contents of each (varying) page.

Upvotes: 0

Flimm
Flimm

Reputation: 151328

You can write your custom template tag to do this.

  1. Create a file named includestatic.py under appname/templatetags/. Also, remember to create appname/templatetags/__init__.py, to include the app in settings and to restart the server.

  2. includestatic.py should have this code:

    from django import template
    from django.contrib.staticfiles import finders
    from django.utils.html import escape
    
    register = template.Library()
    
    @register.simple_tag
    def includestatic(path, encoding='UTF-8'):
        file_path = finders.find(path)
        with open(file_path, "r", encoding=encoding) as f:
            string = f.read()
            return escape(string)
    
  3. To use it in your template, put {% load includestatic %} at the top of your template, and then use the tag like {% includestatic "app/file.txt" %}.

Upvotes: 7

Crt Tax
Crt Tax

Reputation: 407

Do you mean that you want to EXTENDS the parent template the_static.html?

If yes, you should add below code at the first line of your children template:

{% extends "the_static.html" %}

Details documentation can be found here

Upvotes: -2

Ricola3D
Ricola3D

Reputation: 2442

I am not sure I understand everything yet...

You've an HTML page served by Django on a given url, let's suppose it to be http://mydjangodomain/get_the_static/. This URL is set in the urls.py of your model. Ok, that's normal.

You have a django template for this model. Let's suppose it's defined in a template directory mytemplates/mymodeltemplates/ and it's called myfrontpage.html (since in Django templates are html files).

I guess you've an URL defined in your urls.py to server that front page ? Let's suppose it's http://mydjangodomain/get_the_front_page/


Now I don't understand how your front page use your static html. Do your final front page html need the static's URL for a "src" attribute or something like it, or do you need to include the static's html into the front page's html ?

In the 1st case, you already have the URL, it's http://mydjangodomain/get_the_static/ so just use it as if.

In the 2nd case, you don't need the previous URL, get ride of it. Furthermore, put the_static.html in mytemplates/mymodeltemplates/. Then you need the {% include "/mymodeltemplates/the_static.html" %} tag. If this doesn't work, make sure you've the following in your settings:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

APPLI_ROOT_PATH = "<absolute_path_to_the_application_root_on_your_server>"

TEMPLATE_DIRS = (
             '%s/mytemplates' % APPLI_ROOT_PATH,
)

Upvotes: 1

Related Questions