使用标记将 python 字符串插入 Django 模板上下文
Posted
技术标签:
【中文标题】使用标记将 python 字符串插入 Django 模板上下文【英文标题】:Insert python string into Django template context with markup 【发布时间】:2018-12-15 13:34:39 【问题描述】:如果我在 .html 模板中呈现静态图像,它就可以工作。但是,如果我将静态标记字符串作为字典值提供给模板(上下文),它将不起作用。这似乎与字符串格式有关,不允许我以我需要的方式使用 % % 。我试过了: 1. .format() 2. 百分号转义 3. 原始字符串 4. 串联 5. 自动转义 6. |安全 还有一些其他的东西
基本上,我在view.py中用'''% %'''构造一个多行字符串,然后用这个字符串作为上下文渲染一个模板。 Python 2.
更新
简单的非工作示例:
view.py
def index(request):
image_insert = ''
images = ['image1.jpg', 'image2.jpg', 'image3.jpg']
for image in images:
image_insert += '<img src="">'.format(image)
context = 'insert': image_insert
template = loader.get_template('index.html')
return HttpResponse(template.render(context, request))
index.html
% load static %
<!DOCTYPE html>
<html>
<head>
<title>Basic HTML File</title>
</head>
<body>
First Image
<img src=% static "image.jpg" %>
Second Image <!-- does not work -->
image_insert | safe
</body>
</html>
页面来源:
<!DOCTYPE html>
<html>
<head>
<title>Basic HTML File</title>
</head>
<body>
<img src=/static/mqdefault.jpg>
Second Image
<img src="image1.jpg"><img src="image2.jpg"><img src="image3.jpg">
</body>
</html>
显然是有区别的。这是 Django 1.11 顺便说一句,如果它有所作为。
【问题讨论】:
能否请您也发布您的模板? @mrehan 更新 【参考方案1】:您也可以通过如下方式从视图中传递 img 源代码来实现此目的:
views.py
from django.contrib.staticfiles.templatetags.staticfiles import static
def index(request):
context = 'image_src': static("image.jpg")
template = loader.get_template('index.html')
return HttpResponse(template.render(context, request))
index.html
<!DOCTYPE html>
<html>
<head>
<title>Basic HTML File</title>
</head>
<body>
<img src=" image_src ">
</body>
</html>
更新:多张图片
您可以使用多个图像生成标记并将其传递给context
,如views.py
所示:
views.py
from django.contrib.staticfiles.templatetags.staticfiles import static
def index(request):
images = [static('image1.jpg'), static('image2.jpg'), static('image3.jpg')]
images_html = "".join([
"<img src=image>".format(image=image)
for image in images
])
context = 'images_html': images_html)
template = loader.get_template('index.html')
return HttpResponse(template.render(context, request))
现在,您更新后的index.html
将是:
index.html
<!DOCTYPE html>
<html>
<head>
<title>Basic HTML File</title>
</head>
<body>
images_html|safe
</body>
</html>
希望对你有帮助。
【讨论】:
感谢您提供上述替代方案。不幸的是,我在简化示例时犯了一个错误。我实际上是通过 for 循环创建一个字符串,然后尝试将其插入到模板中。请参阅更新的示例。我会为您的时间 +1。抱歉弄错了。 @user58446 好的,让我看看。 @user58446 我已根据您的需要在上面进行了更新。如果这回答了您的问题,请不要忘记接受 + upvote。 – 谢谢! 是的,现在可以了。我到底改变了什么?我正在用文件名字符串创建静态对象?为什么现在可以使用? @user58446"image.jpg"
是无效的静态 url 当你这样做时:<img src="image.jpg">
- 查看页面源并指出不同之处:)【参考方案2】:
工作代码:
def index(request):
context = 'image_insert': "image.jpg"
template = loader.get_template('index.html')
return HttpResponse(template.render(context, request))
index.html
% load static %
<!DOCTYPE html>
<html>
<head>
<title>Basic HTML File</title>
</head>
<body>
First Image
<img src="% static "image.jpg" %">
Second Image <!-- does not work -->
<img src="% static image_insert %">
</body>
</html>
【讨论】:
好的。需要使用带有 % static image % 的图像文件名。我还有另外两个更改,但我得到默认图像占位符的事实让我相信问题出在其他地方。我的天啊。你知道这从我的生命中消失了多久吗?这显然是它应该完成的方式,但我阅读的示例都没有尝试使用上下文进行插入。我尝试这样做的方式......如果失败,它是 python 字符串与 django 的事情吗? 发生这种情况是因为 django 模板后端转义了不安全字符串中的所有字符。因此,当您在 x 是代码表达式(如您的代码)时打印 var x 时,您将获得文本的转义版本(“image.jpg”)。查看默认模板后端docs.djangoproject.com/en/2.1/topics/templates/…中的autoescape配置 好的。我道歉。在将代码简化为一个工作示例时,我遗漏了一个导致它失败(现在仍然如此)的关键部分。我更新了上面的示例:我实际上是在尝试在 for 循环中创建一个字符串,然后将其插入到模板中。用 插入 |安全 我得到三个占位符图像,% insert % 我得到“无效的块标签。你忘记加载或注册这个标签了吗?”。这甚至可以完成,还是我需要为插入创建另一个嵌套模板?很抱歉这个错误。以上是关于使用标记将 python 字符串插入 Django 模板上下文的主要内容,如果未能解决你的问题,请参考以下文章
Django 在字符串中查找 Hashtags 并通过将其包装在 <a> 标记中来替换它
使用 Python Django 框架将 JSON 数据插入 mysql
是否可以使用 django 的自定义模板标签在模板的其他块中插入代码?