Wenn ich eine Seite mit dem Django-Vorlagenrenderer rendere, kann ich eine Wörterbuchvariable mit verschiedenen Werten übergeben, um sie auf der Seite mit zu bearbeiten {{ myVar }}
.
Gibt es eine Möglichkeit, auf dieselbe Variable in Javascript zuzugreifen (möglicherweise mithilfe des DOM weiß ich nicht, wie Django die Variablen zugänglich macht)? Ich möchte in der Lage sein, Details mithilfe einer AJAX-Suche basierend auf den Werten zu suchen, die in den übergebenen Variablen enthalten sind.
escapejs
Filter:escapejs('<>') -> u'\\u003C\\u003E'
VORSICHT Überprüfen Sie Ticket Nr. 17419 auf Erläuterungen zum Hinzufügen eines ähnlichen Tags zum Django-Kern und zu möglichen XSS-Schwachstellen, die durch die Verwendung dieses Vorlagen-Tags mit benutzergenerierten Daten verursacht wurden. In einem Kommentar von amacneil werden die meisten im Ticket angesprochenen Bedenken erörtert.
Ich denke, der flexibelste und praktischste Weg, dies zu tun, besteht darin, einen Vorlagenfilter für Variablen zu definieren, die Sie in JS-Code verwenden möchten. Auf diese Weise können Sie sicherstellen, dass Ihre Daten ordnungsgemäß maskiert werden, und Sie können sie mit komplexen Datenstrukturen wie
dict
und verwendenlist
. Deshalb schreibe ich diese Antwort, obwohl es eine akzeptierte Antwort mit vielen positiven Stimmen gibt.Hier ist ein Beispiel für einen Vorlagenfilter:
Diese Vorlagenfilter konvertieren Variablen in JSON-Zeichenfolgen. Sie können es so verwenden:
quelle
safe
markiert den Wert nur als sicher, ohne ordnungsgemäße Konvertierung und Flucht.function myWidget(config) { /* implementation */ }
in einer JS-Datei und verwenden sie dann auf einigen Seiten mitmyWidget({{ pythonConfig | js }})
. Sie können es jedoch nicht in JS-Dateien verwenden (wie Sie bemerkt haben), daher hat es seine Grenzen.Eine Lösung, die für mich funktioniert hat, ist die Verwendung des versteckten Eingabefelds in der Vorlage
Dann erhalten Sie den Wert in Javascript auf diese Weise,
quelle
Ab Django 2.1 wurde speziell für diesen Anwendungsfall ein neues integriertes Template-Tag eingeführt :
json_script
.https://docs.djangoproject.com/de/3.0/ref/templates/builtins/#json-script
Das neue Tag serialisiert Vorlagenvorlagen sicher und schützt vor XSS.
Django docs Auszug:
quelle
Folgendes mache ich ganz einfach: Ich habe meine base.html-Datei für meine Vorlage geändert und diese unten eingefügt:
Wenn ich dann eine Variable in den Javascript-Dateien verwenden möchte, erstelle ich ein DJdata-Wörterbuch und füge es durch einen JSON zum Kontext hinzu:
context['DJdata'] = json.dumps(DJdata)
Ich hoffe es hilft!
quelle
Für ein Wörterbuch codieren Sie am besten zuerst in JSON. Sie können simplejson.dumps () verwenden oder, wenn Sie aus einem Datenmodell in App Engine konvertieren möchten, encode () aus der GQLEncoder-Bibliothek verwenden.
quelle
Ich hatte ein ähnliches Problem und die von S.Lott vorgeschlagene Antwort arbeitete für mich.
Ich möchte hier jedoch auf wesentliche Einschränkungen bei der Implementierung hinweisen . Wenn Sie planen, Ihren Javascript-Code in einer anderen Datei abzulegen und diese Datei in Ihre Vorlage aufzunehmen. Das wird nicht funktionieren.
Dies funktioniert nur, wenn sich die Hauptvorlage und der Javascript-Code in derselben Datei befinden. Wahrscheinlich kann das Django-Team diese Einschränkung beheben.
quelle
Ich habe auch damit zu kämpfen. An der Oberfläche scheint es, dass die obigen Lösungen funktionieren sollten. Die Django-Architektur erfordert jedoch, dass jede HTML-Datei ihre eigenen gerenderten Variablen hat (dh
{{contact}}
wird gerendertcontact.html
, während{{posts}}
z. B.index.html
usw.). Auf der anderen Seite erscheinen<script>
Tags nach dem{%endblock%}
In,base.html
von demcontact.html
undindex.html
erben. Dies bedeutet im Grunde, dass jede Lösung einschließlichist zum Scheitern verurteilt, da die Variable und das Skript nicht in derselben Datei nebeneinander existieren können.
Die einfache Lösung, die ich schließlich fand und für mich arbeitete, bestand darin, die Variable einfach mit einem Tag mit der ID zu versehen und später in der js-Datei darauf zu verweisen:
und dann:
und ist nur
<script src="static/js/somecode.js"></script>
inbase.html
wie gewohnt. Natürlich geht es nur darum , den Inhalt zu bekommen. Befolgen Sie in Bezug auf die Sicherheit einfach die anderen Antworten.quelle
.textContent
stattdessen verwenden.innerHTML
, da ansonsten Entitäten, die HTML-codiert werden, ebenfalls Teil der JS-Variablen sind. Aber selbst dann wird es möglicherweise nicht 1: 1 reproduziert (ich bin mir nicht sicher).Für ein JavaScript-Objekt, das in einem Django-Feld als Text gespeichert ist und wieder zu einem JavaScript-Objekt werden muss, das dynamisch in ein On-Page-Skript eingefügt wird, müssen Sie beide
escapejs
und Folgendes verwendenJSON.parse()
:Django
escapejs
behandelt das Anführungszeichen ordnungsgemäß undJSON.parse()
konvertiert die Zeichenfolge zurück in ein JS-Objekt.quelle
Beachten Sie, dass Sie, wenn Sie eine Variable an ein externes .js-Skript übergeben möchten, Ihrem Skript-Tag ein anderes Skript-Tag voranstellen müssen, das eine globale Variable deklariert.
data
wird in der Ansicht wie gewohnt in der definiertget_context_data
quelle
Ich benutze diesen Weg in Django 2.1 und arbeite für mich und dieser Weg ist sicher (Referenz) :
Django Seite:
HTML-Seite:
quelle
Sie können das gesamte Skript, in dem Ihre Array-Variable deklariert ist, wie folgt in einer Zeichenfolge zusammenstellen:
Dadurch wird eine Zeichenfolge wie folgt generiert
Nachdem Sie diese Zeichenfolge erhalten haben, müssen Sie sie an die Vorlage senden
In der Vorlage erhalten Sie es und interpretieren es literarisch als HTML-Code, beispielsweise kurz vor dem Javascript-Code, in dem Sie es benötigen
und darunter befindet sich der Rest Ihres Codes. Beachten Sie, dass die im Beispiel zu verwendende Variable data2 ist
Auf diese Weise behalten Sie die Art der Daten, die in diesem Fall eine Vereinbarung ist
quelle
aaa
sie nur Zahlen enthält. Andernfalls ist XSS (Script Injection) möglich.In Javascript haben zwei Dinge für mich funktioniert:
und andere: In views.py
und im HTML:
quelle