【问题标题】:How to render html with django? [duplicate]如何用 django 渲染 html? [复制]
【发布时间】:2020-10-11 04:47:47
【问题描述】:

嗨,我正在练习 Django 和 Python

我遇到解析 HTML 问题,我通过管理页面保存了一些 html,我尝试渲染,但它渲染为字符串!

这是我的模板部分

description

其他列渲染良好

{% block content %}
<div class="article-detail">
    <div class="article">
        <img src="{{ article.thumb.url }}" />
        <h2>{{ article.title }}</h2>
        <p>{{ article.date }}</p>
        <div>
{{ article.description }}
        </div>
    </div>
</div>

{% endblock %}

这是我的模型

from tinymce import HTMLField

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField()
    body = models.TextField()
    description = HTMLField('Content', blank=True)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    thumb = models.ImageField(default='default.png', blank=True)
    ...

这部分我的看法

def article_detail(request, slug):
    article = Article.objects.get(slug=slug)
    return render(request, 'articles/article_detail.html', {'article': article})

我尝试使用 javascript

{% block content %}
<div class="article-detail">
    <div class="article">
        <img src="{{ article.thumb.url }}" />
        <h2>{{ article.title }}</h2>
        <p>{{ article.date }}</p>
    </div>
</div>

<script>
    var article = "<div>{{ article.description }}</div>"
    console.log(article);
    document.write(article);
</script>
{% endblock %}

我希望这个工作,但是
但我得到了 JS 语法错误
控制台不显示任何内容
为什么? 如果它转换为字符串,它应该可以工作....

什么是最好的渲染方式?

我很抱歉我的英语不好

【问题讨论】:

  • 你的view方法在哪里?
  • @Vishal Asthana 哦,我编辑了它
  • 我认为 django 没有 HTML 字段。为什么不直接使用常规的 charField 或 TextField 进行描述?
  • Vishal Asthana 是的,我错过了,我使用的是 tinymce 模块

标签: javascript python html django


【解决方案1】:

Django 的模板引擎会自动转义,所以你真的不需要转义。

如果您添加模板过滤器“安全”,例如 {{article.description|safe}},那么您确实需要担心诸如 html 注入之类的事情,因为“安全”将字符串标记为这样,这意味着它不会被逃脱。

还有一个 {% autoescape on %}...{% endautoescape %} 模板标签,如果需要,可以将其中的“on”更改为“off”。默认开启,不需要标签。

其他模板引擎可能默认不转义,Jinja2 就是其中之一。

【讨论】:

    【解决方案2】:

    默认情况下,Django 自动转义模板变量的输出以避免跨站点脚本。 如果要呈现未转义的字符串,则可以使用safe 过滤器或autoescape 模板块,如下所示:

    {{ var|safe }}
    

    {% autoescape off %}
        {{ var }}
    {% endautoescape %}
    

    【讨论】:

      【解决方案3】:

      将安全过滤器添加到您的 html 模板变量。 Django 自动转义 html 以防止 html 注入。您可以通过添加 |safe 来“关闭它”。例如:

      &lt;div&gt; {{ article.description|safe }} &lt;/div&gt;

      【讨论】:

        【解决方案4】:

        Django 模板处理器正在转义模型中的 HTML 语法。我认为您需要包含此标头标签才能使您的 tinyMCE 应用程序正常工作。它是一些可能呈现 HTMLField 的 javascript 代码。

        <head>
            ...
            {{ form.media }}
        </head>
        

        Reference

        【讨论】:

          猜你喜欢
          • 2018-10-14
          • 2020-04-12
          • 2021-02-17
          • 2018-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-25
          相关资源
          最近更新 更多