【问题标题】:Could I use urlize filter in this way?我可以以这种方式使用 urlize 过滤器吗?
【发布时间】:2011-02-24 18:45:15
【问题描述】:

我可以这样使用 urlize 过滤器吗? :

from django.utils.html import urlize

def save(self, force_insert=False, force_update=False):
    self.body = urlize(self.body)
    super(Post, self).save(force_insert, force_update)

body 是一个 TextField。

【问题讨论】:

    标签: django django-models django-database


    【解决方案1】:

    如果您询问 sn-p 是否可以工作,只要语法被认为是,答案是肯定的,它不应该导致服务器 500 错误。

    但是,urlize 的文档说,我引用:

    请注意,如果 urlize 应用于 已经包含 HTML 的文本 标记,事情不会按预期工作。 仅将此过滤器应用于纯文本。

    因此,假设您的内容在第一次创建对象时是纯文本,一切都应该没问题。

    当您编辑现有对象时,调用save 将在body 属性的内容上重新应用urlize 过滤器,此时不是纯文本。

    据我所知,如果仅在内容中使用格式正确的 HTML 链接,这不会引起严重的悲痛,但文档仍然建议您只应使用纯文本作为 urlize 的参数。

    您可以在每次调用urlize 之前剥离urlize 插入的HTML,例如使用MLStripper class from activestate

    from somelib import MLStripper
    def save(self, force_insert=False, force_update=False):
        html_stripper = MLStripper()
        html_stripper.feed(self.body)
        self.body = urlize(html_stripper.get_fed_data())
        super(Post, self).save(force_insert, force_update)
    

    至少理论上……

    除非你有充分的理由在你的模型中使用模板过滤器,否则你真正应该做的是在你的模板中使用urlize,例如:

    {{ object.body|urlize }}
    

    【讨论】:

    • 是的,我想在模板中使用 urlize,但我读过一本关于 django 的书(关于 django 的权威指南),它可以方便地保存带标签和不带标签的正文(在 2 TextField 中)为了获得更好的性能:-\
    • 出于性能原因,使用两个字段将有利于大量文本,但如果文本大到足以导致性能损失,您可能应该重新考虑处理数据的方式。例如,您可以在输入中使用文本编辑器,以便用户在将文本保存到数据库之前定义链接。我也很难在 Django 权威指南中找到对urlize 的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多