2017-07-11 1 views
1

Ich habe meinen Kopf gegen die Wand geschlagen, um herauszufinden, warum ich eine JSON-Zeichenfolge, die von einem Django-Modell generiert wurde, nicht in die statische JavaScript-Datei einer Vorlage übertragen kann. Wie sich herausstellte, war das Problem nicht auf der Model-Ebene (mit serializers.serialize) - eine identische Zeichenfolge im Skript selbst wird erfolgreich parsen, aber die Zeichenfolge wird nicht übergeben:Weitergabe von JSON-Zeichenfolgen an Django-Vorlagen

views.py:

def texas(request): 
    test_json = '{"incidents": [{"field1": 1, "field2": 2}], "debug": 1}' 
    return render(request, 'tx/texas.html', {'tx': test_json}) 

tx/texas.html:

{% load staticfiles %} 

<html> 
    <head> 
     <title>texas map</title> 
    </head> 
    <body> 
     <p id='texas'></p> 
     <script> 
      function load_texas() { 
       return '{{ tx }}'; 
      } 
     </script> 
     <script src="{% static 'js/texas.js' %}"></script> 
    </body> 
</html> 

js/texas.js irgendwie JSON.parse: erwartete Eigenschaftsname oder '}' in Zeile 1 Spalte 2 der JSON Daten:

var json_data = load_texas(); 

var paragraph = document.getElementById('texas'); 
try { 
    paragraph.innerHTML = JSON.parse(json_data); 
} 
catch(err) { 
    paragraph.innerHTML = err.message; 
} 

aber ist erfolgreich, wenn die gleiche Zeichenfolge nur im Skript eingegeben wird:

// this JSON string is identical to the one passed in views.py 
var json_data = '{"incidents": [{"field1": 1, "field2": 2}], "debug": 1}'; 

Bin ich fehlt etwas über die Art und Weise Django Kontextvariablen behandelt?

Edit:

Nicht ganz fix für einen String übergeben, aber ich bin jetzt ein JSON-Objekt direkt an die Vorlage vorbei, die von immer Modeln in Javascript mein ursprüngliches Problem löst.

views.py:

from django.shortcuts import render 
from django.core import serializers 
import json 
from .models import Tx 

def texas(request): 
    tx_database = Tx.objects.all() 

    # Django serialize puts square brackets around the string, 
    # so slice them off. 
    json_string = serializers.serialize('json', tx_database)[1:-1] 

    # Load string into JSON object... is this best practice? 
    test_json = json.loads(json_string) 
    return render(request, 'tx/texas.html', {'tx': test_json}) 
+0

Haben Sie überprüft, wie das HTML nach dem Laden aussieht (z. B. mit den Chrome-Entwicklertools usw.)? Könnte es doppelte Anführungszeichen um die JSON-Zeichenfolge geben? –

+0

@ ger.s.brett Der Text erscheint im HTML ohne Anführungszeichen. – ultraturtle0

Antwort

2

Sie müssen autoescaping deaktivieren.

return '{{ tx|safe }}'; 

Hinweis, Sie sollten wirklich keine JSON-Daten als Zeichenfolgen in Ihrer Ansicht erstellen. Erstellen Sie es als Python-Datenstruktur und verwenden Sie dann json.dumps().

+0

Ich habe vergessen, 'safe' zu ​​verwenden, aber es scheint keinen Unterschied zu machen, wenn man eine Zeichenfolge übergibt. Sie können in meiner editierten Frage sehen, dass ich meine Modelle als JSON-Objekt über 'json.loads()' (weil das Django-'serializer'-Modul eine String-Repräsentation ausspuckt) übergibt. Das funktioniert, aber gibt es bessere Django-Methoden als diese ? – ultraturtle0

+0

Nein, das macht keinen Sinn. Warum möchten Sie das JSON wieder in Python-Datenstrukturen konvertieren, bevor Sie es an die Vorlage übergeben? –

+0

Sie haben Recht, das macht keinen Sinn. Es funktionierte für das einfache Beispiel oben (wie?), Aber jetzt bekomme ich 'ReferenceError: None is not defined'. – ultraturtle0

Verwandte Themen