2010-07-27 11 views
21

मैं मेरे विचार में इस राशि का उपयोग कर मेरे टेम्पलेट में JSON पार्स करें:Django: जावास्क्रिप्ट

string_location = myaddress2 
    geodata = [] 
    for place, (lat, lng) in g.geocode(string_location,exactly_one=False): 
     geodata.append((place, (lat, lng))) 

    geodata_results = len(geodata) 

    data = {"geodata": geodata, "geodata_results":geodata_results } 
    return render_to_response("business/business_view.html", 
           data, context_instance=RequestContext(request)) 

मैं कैसे "संभाल" होगा/geodata परिवर्तित JSON में और यह मेरे टेम्पलेट के पास इतना है कि मैं यह कर सकते हैं " लूप "इसके माध्यम से एक सरणी की तरह?

क्या मुझे यह सोचने का अधिकार है कि मैं इसे इस तरह से कर सकता हूं? यदि नहीं, तो कृपया एक बेहतर समाधान पर सुझाव दें।

धन्यवाद!

अद्यतन

var geodata = "[["M. L. Quezon Street<br/>Mandaue City, Philippines", [10.351381999999999, 123.923535]], ["Talamban<br/>Cebu City, Philippines", [10.353527, 123.91352500000001]]]"; 

मुझे लगता है कि JSON से छोड़ा नहीं गया है? मैं जेसन स्ट्रिंग के अंदर विशेष पात्रों से कैसे बचूं? मुझे एक नई लाइन त्रुटि मिल रही है।

PHP के लिए, मैं इसे ठीक करने के लिए json_encode() होगा। इस पोस्ट की तरह: Pass a PHP string to a JavaScript variable (and escape newlines) लेकिन मैं पाइथन/Django में ऐसा कैसे करूँ?

उत्तर

52

आप इस्तेमाल कर सकते हैं में निर्मित json मॉड्यूल:

>>> import json 
>>> geodata = [ ("Here", (1003,3004)), ("There", (1.2,1.3)) ] 
>>> json.dumps(geodata) 
'[["Here", [1003, 3004]], ["There", [1.2, 1.3]]]' 

आप बस एक जावास्क्रिप्ट स्क्रिप्ट के अंदर जिसके परिणामस्वरूप स्ट्रिंग तो एम्बेड कर सकते हैं:

<script type='text/javascript'> 
var geodata = {{ geodata|safe }}; 
</script> 
+0

मैं इस लाइन के बाद कोई त्रुटि मिलती है: वर geodata = "[[" एमएल Quezon स्ट्रीट < br/> Mandaue सिटी, फिलीपींस ", [10.351381999999999, १२३.९,२३,५३५]], [" Talamban < br/> सेबू शहर, फिलीपींस ", [10.353527, 123.91352500000001]]] "; मुझे लगता है कि JSON बच नहीं गया है? मैं जेसन स्ट्रिंग के अंदर विशेष पात्रों से कैसे बचूं? – wenbert

+0

क्या यह हो सकता है कि आपने अपने टेम्पलेट 'var geodata = "{{geodata}}" में जोड़ा; "? यह उद्धरण के बिना होना चाहिए। – adamk

+0

नहीं। मैंने उद्धरण के बिना कोशिश की है। मुझे Google में "अनकही सिंटेक्स त्रुटि: अप्रत्याशित टोकन और" और यह त्रुटि मिलती है: "var geodata = [[" एमएल ..;, [10.353527, 123.91352500000001]]]; \ n" फ़ायरफ़ॉक्स – wenbert

27

मेरी समस्या ठीक है, मैं हल और चाहते हैं मेरे अपने प्रश्न का उत्तर देने के लिए। मुझे लगा कि यह अन्य उपयोगकर्ताओं के लिए बेहतर होगा।

पहले, फ़ाइल यहाँ प्राप्त: http://www.JSON.org/json_parse.js

var geodata = json_parse("{{geodata|escapejs}}"); 

मैं सिर्फ इस्तेमाल किया escapejs: http://docs.djangoproject.com/en/dev/ref/templates/builtins/#escapejs

संपादित करें: इग्नेसियो वेज़क्वेज़-अब्राम के लिए धन्यवाद। यह वह था जिसने मुझे #python Freenode में मदद की। जब मैंने यह पोस्ट किया था तो उसे श्रेय देना चाहिए था। मुझे नहीं पता था कि वह स्टैक ओवरफ्लो में था।

+3

ओह तो तुमने किया था। –

+0

गंभीरता से धन्यवाद;) मुझे नहीं पता था कि आप स्टैक ओवरफ्लो – wenbert

+0

में थे 'var geodata = eval ("{{geodata | escapejs}}") का उपयोग करने से यह अलग कैसे है? – simon

9

आप इस तरह IE7 के रूप में पुराने ब्राउज़र के बारे में परवाह नहीं है, तो आप बस लिख सकते हैं:

var geodata = JSON.parse("{{geodata|escapejs}}"); 
किसी भी अतिरिक्त पुस्तकालयों के बिना

। JSON.parse() का समर्थन करने वाले ब्राउज़र संस्करणों के लिए http://caniuse.com/#feat=json देखें।

मेरा मानना ​​है कि @adamk द्वारा शीर्ष वोट वाले उत्तर में संभावित XSS समस्या है। यदि JSON में "</script>" है, तो ब्राउज़र इसे <script> टैग के अंत के रूप में व्याख्या करता है। इसलिए @ वेनबर्ट के कोड या मेरा उपयोग करना बेहतर होगा।

मैं इस सवाल का जवाब सीधे पर टिप्पणी करने की कोशिश की है, लेकिन मुझे लगता है कि :)

1

वहाँ एक लंबे समय से ticket Django में टेम्पलेट फिल्टर के बारे में है करने के लिए पर्याप्त प्रतिष्ठा नहीं है जो होगा टेम्पलेट्स में उत्पादन json। मुख्य समस्या यह है कि समाधान के साथ आना मुश्किल है जिसका उपयोग एक्सएसएस के बिना एचटीएमएल के विभिन्न स्थानों में किया जा सकता है। अब के लिए निम्नलिखित विधियों का उपयोग किया जा सकता है।

HTML तत्व डेटा विशेषता में

स्टोर json:

<div data-geodata="{{json_dump_of_geodata}}"></div> 
<script> 
    var geodata = JSON.parse(
     document.querySelectorAll('[data-geodata]')[0].getAttribute('data-geodata') 
); 
</script> 

या इसका उपयोग करते https://github.com/fusionbox/django-argonauts

<script> 
    var geodata = {{geodata|json}}; 
</script> 

safe फिल्टर का उपयोग न करें जब तक आप 100% यकीन है कि json अविश्वस्त से किसी भी डेटा नहीं है सूत्रों का कहना है।

1

मुझे पता चला है कि मैं अक्सर ऑब्जेक्ट संस्करण (टेम्पलेट कोड के लिए) और जेएसओएन संस्करण (जावास्क्रिप्ट कोड के लिए) दोनों चाहता हूं, और टेम्पलेट में अलग-अलग दोनों को पास करने के लिए थोड़ा परेशान होना चाहिए जब किसी को ठीक करना चाहिए।

यदि आप टेम्पलेट टैग दृष्टिकोण लेना चाहते हैं और django argonauts की सभी घंटियां और सीटी नहीं चाहते हैं तो आप this template tag का उपयोग कर सकते हैं जिसने हमेशा मेरे लिए चाल की है। यह अविश्वसनीय डेटा के खिलाफ 100% सुरक्षित नहीं हो सकता है लेकिन यह मेरे उपयोग के मामलों के लिए कभी भी एक मुद्दा नहीं रहा है।

""" 
Usage: 

{% import json_tags %} 

var = myJsObject = {{ template_var|to_json }}; 

Features: 

- Built in support for dates, datetimes, lazy translations. 
- Safe escaping of script tags. 
- Support for including QuryDict objects. 
- Support for custom serialization methods on objects via defining a `to_json()` method. 
""" 

import datetime 
import json 
from decimal import Decimal 
from django import template 
from django.http import QueryDict 
from django.utils.encoding import force_str 
from django.utils.functional import Promise 
from django.utils.safestring import mark_safe 

register = template.Library() 

ISO_DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ' 


def json_handler(obj): 
    if callable(getattr(obj, 'to_json', None)): 
     return obj.to_json() 
    elif isinstance(obj, datetime.datetime): 
     return obj.strftime(ISO_DATETIME_FORMAT) 
    elif isinstance(obj, datetime.date): 
     return obj.isoformat() 
    elif isinstance(obj, datetime.time): 
     return obj.strftime('%H:%M:%S') 
    elif isinstance(obj, Decimal): 
     return float(obj) # warning, potential loss of precision 
    elif isinstance(obj, Promise): 
     return force_str(obj) # to support ugettext_lazy 
    else: 
     return json.JSONEncoder().default(obj) 


@register.filter 
def to_json(obj): 
    def escape_script_tags(unsafe_str): 
     # seriously: http://stackoverflow.com/a/1068548/8207 
     return unsafe_str.replace('</script>', '<" + "/script>') 

    # json.dumps does not properly convert QueryDict array parameter to json 
    if isinstance(obj, QueryDict): 
     obj = dict(obj) 
    return mark_safe(escape_script_tags(json.dumps(obj, default=json_handler))) 
संबंधित मुद्दे