Django:将HTML字符串传递给模板

Par*_*ich 11 html django jquery django-tagging

我在尝试显示在django视图上创建的html代码块时遇到了问题.这是正在发生的事情.

在我看来,我正在尝试将一堆书籍描述传递给模板,我将根据用户操作隐藏/显示这些书籍描述.这些描述存储在服务器上的html文件中.

def my_view()
     #loop through the list of books, read their corresponding a html file, and parse it to fill in the book details
     #code, code, code...
     #take the resulting string, append it on books description array, log it and send it to template
     logger.debug(books_description["Clockwork orange"])
     return render_to_response("my_template.html", {'bd': books_description}, context_thingy)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我的日志完全按照它应该显示的html字符串:

 <div id="modal_book_name">Clockwork orange</div>
 <div id="modal_book_genre">Dystopian fiction</div>
 <br>
 <div id="modal_book_desc">yadayadayadayada</div>
Run Code Online (Sandbox Code Playgroud)

现在,因为我不希望内容放在我的html代码上,所以我将这些书的描述读成了一个javascript变量,如下所示:

 books_description = {};
 {% for book, book_desc in bd.items %}
       books_description["{{ book }}"] = "{{ book_desc|escapenewline }}"
 {% endfor %}
Run Code Online (Sandbox Code Playgroud)

escapenewline是一个过滤器,它在每行的末尾放置\,以确保javascript能够正确解释整个字符串内容.

最后,当用户想要查看某本书上的描述时,他只需点击它并且模态显示书籍描述.为此,我有:

    console.log(books_description[book_name]);
    $("#modal_info").html(books_description[book_name]);
Run Code Online (Sandbox Code Playgroud)

同样,这个console.log一切似乎都很好:

<div id="modal_book_name">Clockwork orange</div><div id="modal_book_genre">Dystopian fiction</div><br><div id="modal_book_desc">yadayadayadayada</div>
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我打开页面时,modal_info div为空.当我打开浏览器的开发人员工具并检查该div的html时,我看到的是:

 <div id="modal_info">
      "<div id="modal_book_name">Clockwork orange</div><div id="modal_book_genre">Dystopian fiction</div><br><div id="modal_book_desc">yadayadayadayada</div>"
 </div>
Run Code Online (Sandbox Code Playgroud)

问题在于那些引号.他们是怎么出现的?我怎样才能摆脱它们,为什么它们首先放在那里?

提前致谢.如果有任何不清楚的地方,请随意提问,我会澄清一下.

更新:嗯,事实证明modal_info div毕竟不是空的..文本只是与背景颜色相同.道歉,这对我来说是愚蠢的.但问题仍然存在.在哪里我应该看到:

 Clockwork Orange
 Dystopian fiction

 yadayadayadayada
Run Code Online (Sandbox Code Playgroud)

我看到的是文字html:

 <div id="modal_book_name">Clockwork orange</div><div id="modal_book_genre">Dystopian fiction</div><br><div id="modal_book_desc">yadayadayadayada</div>
Run Code Online (Sandbox Code Playgroud)

我试图用parseHTML函数将字符串解析为HTML:

  var book_desc = $.parseHTML(books_description[book_name]);
  $("#modal_info").html(book_desc);
Run Code Online (Sandbox Code Playgroud)

但结果是一样的.任何想法如何让浏览器将字符串解释为HTML代码而不是文字字符串

Par*_*ich 21

问题解决了.没有我想象的那么戏剧化.django正在将html标记转换为'<'和'>'到'<'和'>'

这导致页面上的输出正确,但无法创建相应的DOM对象.

修复:

 {% autoescape off %}
    {% for book, book_desc in bd.items %}
       books_description["{{ book }}"] = "{{ book_desc|escapenewline }}"
    {% endfor %}
 {% endautoescape %}
Run Code Online (Sandbox Code Playgroud)

花了我一会儿.如果有人遇到类似的问题,这里有一些关于autoescaping的情报

自动景观过滤器


小智 15

如果有人在这里使用最新的 django 版本,请使用: {{ your_context_entry|safe }}

  • 这样一个被低估的答案。 (2认同)