我正在尝试从 django 模板中包含一个静态 html 页面。
我尝试使用{% include the_static.html %}
,但由于某些未知原因这不起作用。
the_static.html 页面是一个数据页面,通常会使用 html 编辑器进行修改。
并且 my_model 有一个指向这个 html 的 url 和include
它。但是 django 拒绝找到它,尽管我确定我已经正确设置了路径。
您可以编写自定义模板标签来执行此操作。
创建一个名为includestatic.py
. appname/templatetags/
另外,请记住创建appname/templatetags/__init__.py
,将应用程序包含在设置中并重新启动服务器。
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)
要在模板中使用它,请将其放在模板{% load includestatic %}
的顶部,然后使用{% includestatic "app/file.txt" %}
.
我不确定我是否了解所有内容...
你有一个由 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,
)
有点复活死者,但至少在 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,其中包含我所有的样式引用和导航栏/等,因此其中的 htmlblock content
只是每个(变化的)页面的中心内容。