【问题标题】:What's the best way to render a mixture of html and plain text in Django?在 Django 中混合呈现 html 和纯文本的最佳方式是什么?
【发布时间】:2019-01-18 12:31:20
【问题描述】:

在我的网站上,用户可以使用纯文本和 html 混合创建帖子。我无法很好地呈现他们的帖子。

例如,他们可能会写:

This is the first line of the post.

<!-- whitespace 1 -->

<ul>
<li>List item 1.</li>

<!-- whitespace 2 -->

<li>List item 2.</li>
<li>List item 3.</li>
</ul>
<!-- whitespace 3 -->
This is the last line of the post.

我想渲染空白 1 和 3,而不是空白 2。我该怎么做?

我尝试过使用linebreaksspaceless 的组合,但无法正常工作。

谢谢

杰克

【问题讨论】:

  • 不清楚你真正想要做什么,但你可以使用regex。类似&lt;!--\s\w+\s[13]\s--&gt;
  • 为什么不希望空白 2 呈现?因为它在无序列表中?
  • 我想强制列表全部显示相同,即在我的网站上均匀分布。
  • 如果您在呈现某人的帖子时不使用linebreaks 过滤器,那么纯文本(已分离)会被捆绑在一起。所以你需要使用linebreaks。但是,如果您使用 linebreaks 并且您的帖子包含 html,则 &lt;br&gt; 标签会替换 html 标签之间的换行符,这将导致上例中的列表项之间出现难看的间隙。
  • 您可以使用此模式获取列表标签(?s)(?&lt;=&lt;[uo]l&gt;).*(?=&lt;\/[ou]l&gt;) 中的所有内容,然后使用另一个正则表达式模式&lt;br&gt; 来查看其中是否存在任何
    标签。如果他们拒绝输入。

标签: html django django-templates whitespace removing-whitespace


【解决方案1】:

正如我在评论中提到的,您可以使用正则表达式来获取每个列表内容的匹配集合,然后检查这些内容以确保它们不包含任何 &lt;br&gt; 标记。要收集列表元素的内容,您可以使用此模式 (?s)(?&lt;=&lt;[ou]l&gt;).*?(?=&lt;\/[ou]l&gt;)

使用re.findall("(?s)(?&lt;=&lt;[ou]l&gt;).*?(?=&lt;\/[ou]l&gt;)", inputstring) 收集匹配项后,您可以执行以下操作:

for m in matches:
  if not re.match("<br>", m):
    #input is fine
  else:
    #lists cannot contain <br> tags

这会拒绝包含带有&lt;br&gt; 标签的列表的输入。

为了解释这种模式, (?s) 使得 . 也匹配换行符

(?&lt;=&lt;[ou]l&gt;) 表示模式必须以&lt;ol&gt;&lt;ul&gt; 开头

.*? 表示捕获直到模式下一部分的所有内容

(?=&lt;\/[ou]l&gt;) 表示该模式后跟&lt;/ol&gt;&lt;/ul&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 2015-03-22
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2013-04-03
    相关资源
    最近更新 更多