Django:将带有 HTML 和 Django 模板标签的 Views.py 中的字符串变量注入 HTML 文件
Posted
技术标签:
【中文标题】Django:将带有 HTML 和 Django 模板标签的 Views.py 中的字符串变量注入 HTML 文件【英文标题】:Django: Inject a string variable from Views.py with HTML and Django template tags into HTML file 【发布时间】:2020-04-17 15:45:57 【问题描述】:所以这是我的问题:我有一个 Python 字符串,它同时包含 html 和 Django Template Tags,并希望在我转到该页面时将其注入到基本 HTML 文件中。虽然,当我转到页面时,所有的 HTML 都会呈现,但 Django 模板标签不会,并且被视为字符串?
以下是问题的简化示例:
Views.py
def page(request, code):
html =
'code': code
'html': """<p>Hello world code </p> <script src="% static 'appName/javascript_code_example.js' %"></script>"""
return render(request, 'base.html', html)
base.html
% load static %
...
html | safe
...
当我在本地机器上使用python3 manage.py runserver
运行应用程序并转到呈现base.html 的URL 是Hello world code
时,我将看到的只是Hello world code
,并且没有执行Javascript 代码。而不是 code
,我想在Views.py 文件的html 字典中查看'code'
键的实际值。
如果我的base.html文件如下:
% load static %
...
<p>Hello world code </p>
<script src="% static 'appName/javascript_code_example.js' %"></script>
...
然后Javascript将被启用,我会在屏幕上看到Hello world value_of_code_variable
。
【问题讨论】:
【参考方案1】:您必须加载具有模板库函数的 python 脚本。 另外,为什么要将字符串呈现为 html 而不是创建 html 模板? (带有模板语法的html文件)?
【讨论】:
能否请您更具体地说明“您必须加载具有模板库函数的python 脚本”?不明白你的意思?我的实际 HTML 文件确实具有模板语法 - 我从包含 HTML 模板文件正文的数据库表中提取字符串,但它也包含 Django 模板标签。 在您的应用程序中,您应该有一个名为 templatetags 的文件夹。在其中,您可以拥有 python 脚本和 init.py 文件。假设您有一个名为 template_functions.py 的文件。然后在您的 html 中,您必须有一行类似于% load static %
行。在示例情况下,在您实际使用这些文件中的函数或类之前,它将是 % load template_functions %
。
同样在% load template_functions %
中,您必须确保将您的函数或类注册到模板库中
我还是不明白你的意思?请查看我的问题的更新。如果我在实际的 base.html 文件中包含 html
键的值 <p>Hello world code </p> <script src="% static 'appName/javascript_code_example.js' %"></script>
中的所有内容,那么一切都会按预期工作。当我尝试将其作为字符串注入时,它会将 code
和 % static 'appName/javascript_code_example.js' %
视为文字字符串 - 这就是问题所在。【参考方案2】:
Django 模板引擎不会在注入的字符串中呈现(解析)模板代码。为此,您必须通过以下任一方式手动呈现模板代码:
instantiating aTemplate
object 并将结果字符串传递给您的 base.html
,
或者理想情况下,将html
上下文变量的值移动到模板文件,并使用render_to_string()
。
如果您决定使用最后一个,您绝对应该考虑在您的base.html
中使用include
模板标签(而不是使用render_to_string()
手动渲染),因为它减少了手动工作量,是在另一个模板中呈现模板代码的首选方式。
【讨论】:
【参考方案3】:您可以使用文件写入来完成此任务。 在模板文件夹中创建一个newfile.html,你可以这样做
Views.py
html_tag = "% extends \"yourapp/base.html\"%"+"% block content %"
html_tag +="<p>Hello world code </p> <script src=\"% static \"appName/javascript_code_example.js\" %\"></script>"
html_tag +="% endblock content %"
html_file = open('yourapp/templates/yourapp/newfile.html', "w")
html_file.write(html_tag)
html_file.close()
html =
'code': code
return render(request, r'yourapp\newfile.html', html)
在base.html中
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<p>Your base code</p>
<!--The part of code you want to retrieve from views.py file-->
% block content %% endblock content %
</body>
</html>
【讨论】:
不过我也很好奇你问的问题。许多地方都需要这种类型的 html 代码摄取。以上是关于Django:将带有 HTML 和 Django 模板标签的 Views.py 中的字符串变量注入 HTML 文件的主要内容,如果未能解决你的问题,请参考以下文章