функция urlize из django.utils.html преобразует URL-адреса в интерактивные ссылки. Моя проблема в том, что я хочу добавить target = "_ blank" в "< href.. > ", чтобы открыть эту ссылку на новой вкладке. Есть ли способ расширить функцию urlize для получения дополнительного аргумента? или я должен создать собственный фильтр с помощью регулярных выражений, чтобы сделать это? Является ли это эффективным?
Расширение urlize в django
Ответ 1
Для встроенного urlize()
во встроенной функции urlize()
нет возможности. Благодаря лицензии Django вы можете скопировать код django.utils.html.urlize
и django.template.defaultfilters.urlize
в свой проект или в отдельное приложение и вместо этого использовать новые определения.
Ответ 2
Вы можете добавить настраиваемый фильтр, как описано здесь:
Я использовал этот:
def url_target_blank(text):
return text.replace('<a ', '<a target="_blank" ')
url_target_blank = register.filter(url_target_blank, is_safe = True)
Пример использования:
{{ post_body|urlize|url_target_blank }}
Прекрасно работает для меня:)
Ответ 3
Самая короткая версия, которую я использую в своих проектах. Создайте новый фильтр, который расширяет фильтр Django по умолчанию:
from django import template
from django.template.defaultfilters import stringfilter
from django.utils.safestring import mark_safe
from django.utils.html import urlize as urlize_impl
register = template.Library()
@register.filter(is_safe=True, needs_autoescape=True)
@stringfilter
def urlize_target_blank(value, limit, autoescape=None):
return mark_safe(urlize_impl(value, trim_url_limit=int(limit), nofollow=True, autoescape=autoescape).replace('<a', '<a target="_blank"'))
Ответ 4
Вы не должны добавлять target="_blank"
к своим ссылкам, это не рекомендуется. Пользователи должны сами решить, где они хотят открыть ссылку.
Вы все равно можете открыть ссылку с ненавязчивым JavaScript вроде этого (используя jQuery):
$('.container a').click(function(e){e.preventDefault();window.open(this.href);});
Тем не менее, вы можете написать свой собственный фильтр, но вам придется скопировать много кода из django.utils.html.urlize
, а не действительно DRY.