在django中扩展urlize

时间:2010-02-19 10:58:23

标签: django

django.utils.html中的urlize函数将url转换为可点击的链接。我的问题是我想将一个target =“_ blank”附加到“< href ..>”中,以便我在新标签中打开此链接。有什么办法可以扩展urlize函数来接收额外的参数吗?或者我应该使用正则表达式来制作自定义过滤器来执行此操作?这有效吗?

4 个答案:

答案 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.urlizedjango.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