【问题标题】:How to interpret/render template tags as HTML from Django database如何将 Django 数据库中的模板标签解释/呈现为 HTML
【发布时间】:2019-11-29 19:30:05
【问题描述】:

我正在尝试从 Django 管理站点添加带有图像的帖子,但安全/自动转义过滤器无法解释 Django 的模板标签。

我的输入和页面如下所示:

“复制图片地址”给http://127.0.0.1:8000/%7B%%20static%20'post/image.jpg'%20%%7D

我的视图继承自通用 ListView。

我的 base.html 和 post_list.html:

<!DOCTYPE html>
{% load static %}
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <div style="color: red;">
      <a href="{% url 'admin:index' %}">admin</a>
      {% block contents %}
      {% endblock %}
    </div>
  </body>
</html>

{% extends 'post/base.html' %}
{% block contents %}
{% for post in object_list %}
  {% autoescape off %}{{ post.text }}{% endautoescape %}
  {{ post.text|safe }}
{% endfor %}
{% endblock %}

【问题讨论】:

  • 您可能没有在配置中定义TEMPLATE 设置
  • 我只指定了'DIR',其他设置为默认,这里需要定义什么?

标签: python html django django-templates


【解决方案1】:

您无法直接在模板中执行您想要执行的操作。 Django 模板由稍后解析为字符串的“节点”组成。使用{{ variable }} 语法的节点总是返回一个字符串:即使您使用safe 过滤器,Django 也不会尝试将您的post.text 字符串转换为要由模板引擎呈现的节点。

您可以通过手动将文本呈现为 Django 模板在视图中解决此问题:

from django.template import Template

class MyListView(ListView):

    #...your existing code

    def get_context_data(self, **kwargs):
        context = super(MyListView, self).get_context_data(**kwargs)
        for post in context["object_list"]:
            post.rendered_text = Template(post.text).render(context)
        return context        

然后在你的模板中:

{% for post in object_list %}
    {{ post.rendered_text|safe }}
{% endfor %}

但要小心!从安全的角度来看,这是一个非常糟糕的主意! safe 标签已经非常危险,因为它允许跨站点脚本攻击:任何有权创建帖子的人都可以注入显示给用户的恶意 Javascript。这个额外的渲染步骤更加危险,因为它还提供了对 Django 模板语言和视图的所有上下文的访问权限,这些上下文可以访问服务器端的机密。

【讨论】:

  • 感谢您的帮助,我尝试了您的代码,但没有成功,而且我认为您需要 .render(Context(context)) 以便它没有错误(Django 2.2)。但是,我是网络新手,所以我的逻辑和方法可能很幼稚(正如你提到的那样危险),有什么更好/更常见的方法来实现我想要的?即将文本和媒体内容添加到 db 并让它们自动处理并显示在网页上。
  • 这解决了我的问题:stackoverflow.com/questions/7661560/…
猜你喜欢
  • 2017-05-04
  • 1970-01-01
  • 2019-09-29
  • 2012-12-18
  • 2012-12-11
  • 2021-10-28
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多