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 键的值 &lt;p&gt;Hello world code &lt;/p&gt; &lt;script src="% static 'appName/javascript_code_example.js' %"&gt;&lt;/script&gt; 中的所有内容,那么一切都会按预期工作。当我尝试将其作为字符串注入时,它会将 code % static 'appName/javascript_code_example.js' % 视为文字字符串 - 这就是问题所在。【参考方案2】:

Django 模板引擎不会在注入的字符串中呈现(解析)模板代码。为此,您必须通过以下任一方式手动呈现模板代码:

instantiating a Template 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 文件的主要内容,如果未能解决你的问题,请参考以下文章

带有 css/js 的 Django“包含”模板

带有django和python socket io的事件

带有单独提交和上传按钮的 Django 应用程序

带有信息的 Django HTML POST 删除按钮

带有 Nginx 和 uWSGI 的 Django CDN

带有 % extends 的每页上的 Django 页脚和页眉