2010-02-19 69 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