使用标记将 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 当你这样做时:&lt;img src="image.jpg"&gt; - 查看页面源并指出不同之处:)【参考方案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 的自定义模板标签在模板的其他块中插入代码?

Django - 仅将字符串/用户输入的某些部分标记为安全?

如何将 django csrf 令牌直接嵌入 HTML?

Python/Django - 在 for 标记中获取 ManyToManyField 的值