django.utils.html中的urlize函数将url转换为可点击的链接。我的问题是我想将一个target =“_ blank”附加到“< href ..>”中,以便我在新标签中打开此链接。有什么办法可以扩展urlize函数来接收额外的参数吗?或者我应该使用正则表达式来制作自定义过滤器来执行此操作?这有效吗?
答案 0 :(得分:58)
您可以添加自定义过滤器,如here所述:
我用过这个:
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 }}
适合我的工作:)
答案 1 :(得分:13)
我在项目中使用的最短版本。创建一个新的过滤器,它扩展了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"'))
答案 2 :(得分:4)
内置urlize()
无法执行此操作。由于Django的许可,您可以将django.utils.html.urlize
和django.template.defaultfilters.urlize
的代码复制到您的项目或单独的应用程序中,并使用新的定义。
答案 3 :(得分:-3)
您不应将target="_blank"
添加到您的链接,不推荐使用。用户应自行决定是否要在何处打开链接。
您仍然可以使用不引人注目的JavaScript(使用jQuery)打开链接:
$('.container a').click(function(e){e.preventDefault();window.open(this.href);});
也就是说,您可以编写自己的过滤器,但是您必须从django.utils.html.urlize
复制大量代码,而不是DRY。