37 Stimmen

urlize in django erweitern

Die Funktion urlize aus django.utils.html wandelt Urls in klickbare Links um. Mein Problem ist, dass ich ein target="_blank" in das "< href..>" anhängen möchte, so dass ich diesen Link in einem neuen Tab öffne. Gibt es eine Möglichkeit, die urlize-Funktion so zu erweitern, dass sie ein zusätzliches Argument erhält? oder sollte ich einen benutzerdefinierten Filter mit Regexen erstellen, um diese Dinge zu tun? Ist dies effizient?

68voto

Wojteks Punkte 826

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

Ich habe diese benutzt:

# <app name>/templatetags/url_target_blank.py

from django import template
register = template.Library()

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

url_target_blank = register.filter(url_target_blank, is_safe = True)

Beispiel für die Verwendung:

{% load url_target_blank %}
...
{{ post_body|urlize|url_target_blank }}

Funktioniert gut bei mir :)

10 Stimmen

Ich musste hinzufügen: url_target_blank.is_safe = True, um zu verhindern, dass Django den Link ausspart.

2 Stimmen

Um eine breitere Verwendung von url_target_blank zu ermöglichen und um es etwas enger zu fassen: Ich würde einen regulären Ausdruck in der Rückgabezeile verwenden: def url_target_blank(value): return re.sub("<a([^>]+)(?<!target=)>",'<a target="_blank" \\1 >',value)

3 Stimmen

Das ist eine sehr schöne Antwort, die als Antwort akzeptiert werden sollte.

16voto

Simon Steinberger Punkte 6325

Die 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 Stimmen

Sie benötigen außerdem from django.utils.safestring import mark_safe

0 Stimmen

Oh so können Sie in der Tat erweitern die eingebaute templatetag?

0 Stimmen

urlize hat trim_url_limit=None. Ich habe also None als Standard hinzugefügt: urlize_target_blank(value, limit=None, autoescape=None)

6voto

Ignacio Vazquez-Abrams Punkte 735200

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

-4voto

stefanw Punkte 10188

Sie sollten nicht hinzufügen target="_blank" in Ihre Links einfügen, das ist veraltet. Die Nutzer sollten selbst entscheiden, wo sie einen Link öffnen wollen.

Sie können den Link auch mit unauffälligem JavaScript öffnen (mit jQuery):

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

Sie könnten zwar Ihren eigenen Filter schreiben, aber Sie müssten eine Menge Code aus django.utils.html.urlize nicht wirklich DRY .

2 Stimmen

In HTML5 nicht mehr veraltet.

0 Stimmen

"In HTML5 nicht mehr veraltet" Das ist wahr. W3Schools sagt HTML5 Tag A und in einem anderen Artikel heißt es XHTML veraltet Ein Ziel-Tag

0 Stimmen

W3Schools ist keine gute Quelle. Gehen Sie lieber direkt zur Spezifikation.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X