2010-02-19 76 views
29

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

回答

4

内置urlize()没有这样做的能力。由于Django的许可证,您可以将django.utils.html.urlizedjango.template.defaultfilters.urlize的代码复制到您的项目或单独的应用程序中,并改为使用新定义。

-3

您不应该将target="_blank"添加到您的链接,它已被弃用。用户应该自行决定他们想在哪里打开链接。

您仍然可以打开链接与非侵入式JavaScript像这样(使用jQuery):

$('.container a').click(function(e){e.preventDefault();window.open(this.href);}); 

这就是说,你可以编写自己的过滤器,但你必须有很多的代码复制django.utils.html.urlize ,不是真的DRY

+2

在HTML5中不再弃用。 – 2011-11-14 13:04:50

+0

“在HTML5中不再弃用”这是真的。 W3Schools称[HTML5标签A](http://www.w3schools.com/html5/tag_a.asp),另一篇文章称[XHTML已弃用目标标签](http://www.infranet.com/_blog/Complete_Website_Optimization_Blog/ post/Replacing_the_XHTML_deprecated_a_target_tag /) – 2011-12-18 21:20:09

+0

W3Schools不是一个好的来源。而是直接去规范。 – stefanw 2012-06-01 09:39:44

54

您可以添加自定义过滤器,如描述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 }} 

工作正常,我:)

+0

很酷的答案,它也帮助我,谢谢! – dana 2010-06-19 08:54:30

+9

我不得不添加:url_target_blank.is_safe = True以防止Django转义链接。 – 2010-07-08 17:40:54

+1

为了更广泛地使用url_target_blank并使其稍微更紧密:我会在返回行中使用正则表达式: def url_target_blank(value): return re.sub(“”+)(?“,'<一个目标=“_ blank”\\ 1>',值) – Boaz 2010-12-14 10:16:33

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"')) 
+0

您还需要'from django.utils.safestring import mark_safe' – Nick 2014-08-26 21:13:03

+0

您是对的 - 谢谢。答案已更正。 – 2014-08-27 06:24:21