从Django模板中包含静态文件

5

我正在尝试从Django模板中包含一个静态的HTML页面。

我尝试使用{% include the_static.html %},但由于一些未知的原因,它无法正常工作。

the_static.html页面是一个数据页面,将经常使用HTML编辑器进行修改。
而我的模型有一个指向这个HTML的URL,并且使用include将其包含进来。但是,尽管我确信已经正确设置了路径,但Django仍然找不到它。


它不起作用是因为include标签不是用来包含外部html文件而是其他模板。请查看此答案以获取您问题的可能解决方案:http://stackoverflow.com/a/7337703/630877 - arie
4个回答

7

您可以编写自定义模板标签来实现此功能。

  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" %}.


根据使用情况,“mark_safe()”可能比“escape()”更好。 - guettli

1
我还不确定是否完全理解了一切...
您有一个由Django提供的HTML页面,它在给定的URL上提供服务,假设它是http://mydjangodomain/get_the_static/。此URL在您的模型的urls.py中设置。好的,这很正常。
您为此模型编写了一个Django模板。假设它定义在模板目录mytemplates/mymodeltemplates/中,名为myfrontpage.html(因为在Django中模板是html文件)。
我猜您在urls.py中定义了一个URL来提供该前端页面?假设它是http://mydjangodomain/get_the_front_page/
现在我不明白你的首页如何使用静态HTML。你的最终首页HTML是否需要静态的URL作为“src”属性或类似的东西,还是需要将静态的HTML包含到首页的HTML中?
在第一种情况下,你已经有了URL,它是http://mydjangodomain/get_the_static/,所以只需像平常一样使用即可。
在第二种情况下,你不需要之前的URL,请删除它。此外,将the_static.html放入mytemplates/mymodeltemplates/中。然后你需要{% include "/mymodeltemplates/the_static.html" %}标签。如果这不起作用,请确保在设置中有以下内容:
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,
)

1
谢谢您提供详细的答案,是的,我想要第二种情况。我尝试使用myapp/data_dir而不是myapp/templates/data_dir,并将data_dir添加到STATICFILES_DIR设置中。但显然,Django找不到它。 - eugene

0

有点像让死者复活,但至少在django 1.10中,这里有一个非常干净的答案:

http://www.effectivedjango.com/tutorial/static.html

该页面的摘录:

简单的模板包含我们想要将Boostrap CSS添加到所有模板中,但我们希望避免重复:如果我们将其添加到每个模板中,当我们想要进行更改(例如添加另一个样式表)时,我们必须对所有文件进行更改。为了解决这个问题,我们将创建一个基本模板,其他模板将从中继承。

让我们在contacts应用程序的templates目录中创建base.html。

{% 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 定义了我们页面的通用结构,并包含一个块标签,其他模板可以填充它。
我们将更新 contact_list.html 以从 base.html 继承并填充内容块。
{% 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 %}

按照这个步骤,我现在有了一个包含所有样式引用和导航栏等的base.html,因此block content中的html仅是每个(不同的)页面的中央内容。


-2
你的意思是想要扩展父模板 the_static.html 吗?
如果是的话,你应该在子模板的第一行添加以下代码:
{% extends "the_static.html" %}

详细文档可以在这里找到


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接