2010-02-19 4 views
29

Die Funktion urlize von django.utils.html konvertiert URLs in klickbare Links. Mein Problem ist, dass ich ein Target = "_ blank" an die "< href ..>" anhängen möchte, damit ich diesen Link in einem neuen Tab öffne. Gibt es eine Möglichkeit, dass ich die urlize-Funktion erweitern kann, um ein zusätzliches Argument zu erhalten? oder sollte ich einen benutzerdefinierten Filter mit Regexes machen, um diese Sachen zu machen? Ist das effizient?Erweitern von urlize in django

Antwort

4

In dem eingebauten urlize() gibt es keine Möglichkeit, dies zu tun. Aufgrund der Lizenz von Django können Sie den Code django.utils.html.urlize und django.template.defaultfilters.urlize in Ihr Projekt oder in eine separate App kopieren und stattdessen die neuen Definitionen verwenden.

-3

Sie sollten target="_blank" nicht zu Ihren Links hinzufügen, es ist veraltet. Benutzer sollten selbst entscheiden, ob sie einen Link öffnen möchten.

Sie können immer noch die Verbindung mit unaufdringlichen JavaScript öffnen wie so (mit jQuery):

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

Das heißt, Sie Ihre eigenen Filter schreiben könnte, aber Sie würden eine Menge Code aus django.utils.html.urlize kopieren müssen , nicht wirklich DRY.

+2

Nicht mehr veraltet in HTML5. –

+0

"Nicht mehr veraltet in HTML5" Das stimmt. W3Schools sagt [HTML5 Tag A] (http://www.w3schools.com/html5/tag_a.asp) und ein anderer Artikel sagt [XHTML verwarf ein Ziel-Tag] (http://www.infranet.com/_blog/Complete_Website_Optimization_Blog/ post/Replacing_the_XHTML_deprecated_a_target_tag /) –

+0

W3Schools ist keine gute Quelle. Gehe lieber direkt zur Spezifikation. – stefanw

54

Sie können einen benutzerdefinierten Filter hinzufügen, wie here beschrieben:

ich verwendet, um dieses ein:

def url_target_blank(text): 
    return text.replace('<a ', '<a target="_blank" ') 
url_target_blank = register.filter(url_target_blank, is_safe = True) 

Anwendungsbeispiel:

{{ post_body|urlize|url_target_blank }} 

funktioniert gut für mich :)

+0

coole Antwort, es hat mir auch geholfen, danke! – dana

+9

Ich musste hinzufügen: url_target_blank.is_safe = True, um zu verhindern, dass Django die Verbindung verlässt. –

+1

Um eine breitere Verwendung von url_target_blank zu erlauben und es etwas enger zu machen: def url_target_blank (Wert): return re.sub ("? ] +) (", " ', Wert) – Boaz

13

Kürzeste Version, die ich in meinen Projekten verwende. Erstellen Sie einen neuen Filter, der den Standardfilter von Django erweitert:

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

Du brauchst auch 'from django.utils.safestring import mark_safe' – Nick

+0

Du hast recht - danke. Antwort korrigiert –

Verwandte Themen