Подтвердить что ты не робот

Расширение urlize в django

функция urlize из django.utils.html преобразует URL-адреса в интерактивные ссылки. Моя проблема в том, что я хочу добавить target = "_ blank" в "< href.. > ", чтобы открыть эту ссылку на новой вкладке. Есть ли способ расширить функцию urlize для получения дополнительного аргумента? или я должен создать собственный фильтр с помощью регулярных выражений, чтобы сделать это? Является ли это эффективным?

4b9b3361

Ответ 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.