Могу ли я использовать URL-фильтр таким образом? - PullRequest
0 голосов
/ 27 мая 2010

Могу ли я использовать URL-фильтр таким образом?:

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.

1 Ответ

1 голос
/ 28 мая 2010

Если вы спрашиваете, будет ли этот фрагмент работать, если учитывать синтаксис, ответ - да, он не должен вызывать ошибку сервера 500.

Но, документация для urlize говорит, и я цитирую:

Обратите внимание, что если urlize применяется к текст, который уже содержит HTML разметка, все не будет работать, как ожидалось. Примените этот фильтр только к простому тексту.

При условии, что при первом создании объекта ваш контент представляет собой простой текст, все должно быть в порядке.

Когда вы редактируете существующий объект, вызов save приведет к повторному применению фильтра urlize к содержимому атрибута body, который на данный момент не является простым текстом.

Насколько я могу судить, это не вызовет серьезного горя, если в контенте используются только правильно отформатированные ссылки HTML, но в документации по-прежнему предполагается, что в качестве аргумента urlize следует использовать только простой текст.

Вы можете вырезать HTML, вставленный urlize каждый раз перед вызовом urlize, например, используя класс MLStripper из 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 }}
...