3

Django Basic Inlines 应用程序根据 app/model/id 组合从伪 HTML 语法呈现预先确定的模板。例如,如果您正在撰写博客文章,则可以插入保存在图像模型中的图像:

# In the admin
This is the body of my post.

<inline type="media.image" id="1" class="full">

然后模板采用一个render_inlines过滤器,需要对其进行标记safe以便正确呈现 HTML:

# Template
{{ post.body|render_inlines|safe }}

但即使使用safe,过滤器仍然会转义 HTML,&lt;p&gt;&lt;img src="..."&gt;&lt;p&gt;在源代码中创建。

根据文档,过滤器应该mark_safe用来防止过滤器级别的自动转义,但是已经使用的inlines功能。parser.pymark_safe

Django 1.4 中是否还需要在自定义过滤器层停止自动转义?我似乎无法摆脱这种自动转义,无论是在

我尝试使用autoescape=None,这似乎也没有帮助。

4

3 回答 3

2

另一个解决方案是将新代码转换为 BeautifulSoup 对象,并用该对象替换。这样漂亮的汤似乎表现得很好。

这为您提供了转义的 html:

soup = BeautifulSoup(html_doc)
body = soup.body
new_html = """<p> this is some deap code</p><a href="#">Pointless even</a>"""
body.replaceWith(new_html)

这使您的 html 未转义:

soup = BeautifulSoup(html_doc)
body = soup.body
new_html = """<p> this is some deap code</p><a href="#">Pointless even</a>"""
body.replaceWith(BeautifulSoup(new_html))
于 2012-04-13T09:43:03.247 回答
1

我维护了一个内联应用程序的分支。Richard 就这个问题与我联系,我能够将其追溯到 BeautifulSoup,而不是 Django。

问题是 BeautifulSoup 的replaceWith()方法被用来用渲染的模板替换内联标记。结果render_to_string()当然是一个字符串。当replaceWith()接收到一个字符串时,它将它变成一个NavigableString. 由于 BeautifulSoup 期望NavigbleStrings 是字符串,它假定它们是不安全的并转义任何 HTML 字符。结果是内联inlines()函数返回的值有一堆&gt;and&lt;而不是<and >

我在 Django 1.3 中没有注意到这个问题。当我查看时,BeautifulSoup 确实返回了转义的 HTML。Django 的|safe模板过滤器一定已经对之前转义的 HTML 进行了转义。在 Django 1.4 中,它不再这样做了。(它不应该那样做!)

我对此的解决方法是使用 BeautifulSoup 解析传入的值并使用 BeautifulSoup 来查找所有内联标记,就像以前一样。而不是使用 BeautifulSoup 的replaceWith()方法来用渲染的内联模板替换内联标记,我现在只使用 Python 的普通 old str.replace(). 我觉得有点蹩脚,将解析后的汤转换回字符串,然后进行字符串替换。但它有效。我部分地想要完全取消 BeautifulSoup 并使用正则表达式找到内联标记,但我们都知道它是如何结束的。如果有人有更好的主意,我全神贯注!

该修复最初是在此提交中实现的。我在下面的提交中改进了它,但显然 StackOverflow 只允许我最多发布两个链接,所以你必须自己找到那个!

于 2012-04-03T01:51:55.897 回答
0

是因为render_to_string 这里。转到inlines/app_model.html并在内容变量之后inlines/default.html添加。|safe

于 2012-03-31T02:48:00.263 回答