【问题标题】:include static files from django template包含来自 django 模板的静态文件
【发布时间】:2013-07-23 09:03:43
【问题描述】:

我正在尝试从 django 模板中包含一个静态 html 页面。

我尝试使用{% include the_static.html %},但由于某些未知原因这不起作用。

the_static.html 页面是一个数据页面,通常会使用 html 编辑器进行修改。
my_model 有一个指向这个 html 的 url 和 include 它。但是 django 拒绝找到它,尽管我确定我已经正确设置了路径。

【问题讨论】:

  • 它不起作用,因为 include-tag 并不意味着包含外部 html 文件,而是包含其他模板。检查此答案以获得您问题的可能解决方案:stackoverflow.com/a/7337703/630877

标签: django templates static


【解决方案1】:

你可以写你的custom template tag来做这件事。

  1. appname/templatetags/ 下创建一个名为includestatic.py 的文件。另外,请记住创建appname/templatetags/__init__.py,以将应用程序包含在设置中并重新启动服务器。

  2. includestatic.py 应该有这个代码:

    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. 要在模板中使用它,请将{% load includestatic %} 放在模板顶部,然后使用{% includestatic "app/file.txt" %} 之类的标签。

【讨论】:

    【解决方案2】:

    我不确定我是否了解所有内容...

    你有一个由 Django 在给定 url 上提供的 HTML 页面,假设它是 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/,所以就当当使用它吧。

    在第 2 种情况下,您不需要以前的 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,
    )
    

    【讨论】:

    • 感谢您的详细回答,是的,我想要的是第二种情况。我正在尝试使用 myapp/data_dir 而不是 myapp/templates/data_dir 。我将 data_dir 添加到 STATICFILES_DIR 设置中。但显然 django 没有找到它。
    【解决方案3】:

    有点复活死者,但至少在 django 1.10 中,这里有一个非常干净的答案: http://www.effectivedjango.com/tutorial/static.html

    该页面的摘录:

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

    让我们在联系人应用程序的模板目录中创建 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 只是每个(变化的)页面的中心内容。

    【讨论】:

      【解决方案4】:

      您的意思是要扩展父模板 the_static.html?

      如果是,您应该在子模板的第一行添加以下代码:

      {% extends "the_static.html" %}
      

      详细文档可见here

      【讨论】:

        猜你喜欢
        • 2016-04-13
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 2013-06-18
        • 2015-01-20
        相关资源
        最近更新 更多