2013-03-23 7 views
21

मैं एक परियोजना के लिए एक वेब आधारित अनुप्रयोग बनाने के लिए Django उपयोग कर रहा हूँ करने के लिए एक Django दृश्य से JSON सारणी रिटर्निंग, और मैं एक टेम्पलेट के लिए एक Django दृश्य से एक सरणी लौटने मुद्दों में चल रहा हूँ।एक टेम्पलेट

सरणी एक छवि पेज में दिखाया गया है पर बक्से ड्राइंग के लिए एक जावास्क्रिप्ट (JQuery) स्क्रिप्ट द्वारा उपयोग किया जाएगा। इसलिए, इस सरणी में अन्य चीजों के साथ, बक्से तैयार किए जाने के लिए समन्वय होगा। ,

def annotate(request, ...): 
    ... 
    oldAnnotations = lastFrame.videoannotation_set.filter(ParentVideoLabel=label) 
    tags = serializers.serialize("json", oldAnnotations) 
    ... 
    return render_to_response('vannotate.html', {'tags': tags, ...}) 

डिबगिंग के एक तरीके के रूप में टेम्पलेट के एचटीएमएल हिस्से में {{ tags }} का उपयोग कर उत्पादन के रूप में इस देता है:

यह Django दृश्य JSON के रूप में आवश्यक डेटा मिलता है और यह क्रमानुसार करने के लिए इस्तेमाल किया में कोड है (लंबी लाइन के लिए खेद है):

[{"pk": 491, "model": "va.videoannotation", "fields": {"ParentVideoFile": 4, "ParentVideoFrame": 201, "ParentVideoLabel": 4, "top": 220, "height": 30, "width": 30, "ParentVideoSequence": 16, "left": 242}}, {"pk": 492, "model": "va.videoannotation", "fields": {"ParentVideoFile": 4, "ParentVideoFrame": 201, "ParentVideoLabel": 4, "top": 218, "height": 30, "width": 30, "ParentVideoSequence": 16, "left": 307}}] 

जो मुझे लगता है कि एक JSON सरणी के लिए सही प्रारूप है।

बाद टेम्पलेट में, मैं, इस प्रकार वास्तव में टेम्पलेट के लिए जावास्क्रिप्ट हिस्से में tags चर का उपयोग करने का प्रयास:

{% if tags %} 
    var tagbs = {{ tags|safe }}; 
    var tgs = JSON.parse(tagbs); 
    alert("done"); 
{% endif %} 

अगर मैं var tgs = JSON.parse(tagbs); लाइन निकालें, तब चेतावनी बॉक्स अप ठीक पॉप , और बाकी जावास्क्रिप्ट अपेक्षित काम करता है। हालांकि, इस लाइन को लिपि में छोड़कर लिपि को छोड़ दिया गया है।

मैं Django मॉडल में सभी वस्तुओं के माध्यम से पुनरावृति और जावास्क्रिप्ट में क्षेत्रों के मूल्यों को प्राप्त करने में सक्षम होना चाहता हूँ।

मुझे यकीन है कि मैं गलत यहाँ क्या कर रहा हूँ नहीं कर रहा हूँ, किसी को ऐसा करने के लिए सही तरीके से बाहर बिंदु सकता है?

+1

आप जावास्क्रिप्ट को डेटा भेजने वाले नहीं, तो आप स्क्रिप्ट में सर्वर साइड पर इंजेक्शन लगाने के हैं और इसलिये कोड क्लाइंट पर JavaScript रूप में व्याख्या की है। यदि आप स्रोत पर एक नज़र डालते हैं, तो आप देखेंगे कि यह एक सामान्य सरणी शाब्दिक है। यह इस संदर्भ में JSON नहीं है, इसलिए आप इसे पार्स नहीं कर सकते हैं। –

उत्तर

34

JSON जावास्क्रिप्ट स्रोत कोड है। अर्थात। सरणी का JSON प्रतिनिधित्व जावास्क्रिप्ट स्रोत कोड है जिसे आपको सरणी को परिभाषित करने की आवश्यकता है।

तो बाद:

var tagbs = {{ tags|safe }}; 

tagbs डेटा आप चाहते हैं एक JavaScript है। JSON.parse() को कॉल करने की कोई आवश्यकता नहीं है, क्योंकि वेब ब्राउज़र ने इसे पहले ही जावास्क्रिप्ट स्रोत कोड के रूप में पार्स किया है।

तो तुम और

var tagbs = {{ tags|safe }}; 
alert(tagbs[0].fields.ParentVideoFile); 

ऐसा करने में सक्षम होना चाहिए कि "4" दिखाना चाहिए।

+2

मैन, मुझे स्टैक ओवरफ्लो पसंद है। उस छोटे फिक्स सब कुछ हल! मैं इसके लिए नया हूं, मैंने सोचा था कि JSON.parse एक JSON चर को एक सरणी में पार्स करना था, न कि दूसरी तरफ। बहुत बहुत धन्यवाद! – DefPlayr

+0

आपको यहां 'सुरक्षित' का उपयोग नहीं करना चाहिए; यह केवल HTML स्वच्छता के लिए आवश्यक है। जेएसओएन ने पहले ही यह सुरक्षित जावास्क्रिप्ट बनाया है, किसी भी एचटीएमएल सामग्री को * से बच नहीं जाना चाहिए। –

+2

हम्म, मैंने 'सुरक्षित' को हटाने का प्रयास किया, लेकिन यह तब काम नहीं करता है। – DefPlayr

4

आप टेम्पलेट में डेटा डेटा JSON-ify करना चाहते हैं; ; बचने के लिए कोई जरूरत नहीं (कोई HTML यहां है, यह जावास्क्रिप्ट है बजाय

{% if tags %} 
    var tgs = {{ tags }}; 
{% endif %} 

ध्यान दें कि tags पहले से ही JSON (इस प्रकार जावास्क्रिप्ट) डेटा और सीधेडाला जा सकता है: JSON पहले से ही जावास्क्रिप्ट वास्तव में है (यह एक सबसेट है ।)

या आप इस Django snippet का उपयोग करें और सीधे टेम्पलेट (annotate विधि में serializers.serialize कॉल करने के लिए कोई जरूरत नहीं) में यह कर सकता है:

var tgs = {{ tags|jsonify }}; 
+0

क्या मुझे 'विचारों' फ़ाइल में 'jsonify' फ़िल्टर परिभाषा डालना है? मैंने लिंक पर दिए गए निर्देशों का पालन करने का प्रयास किया, लेकिन Django मुझे बताता है कि 'jsonify' फ़िल्टर अमान्य है। – DefPlayr

+0

@ user2203255: यह एक नया 'templatetags' उप पैकेज में (एक निर्देशिका' __init __ साथ py' फ़ाइल।) डाल अगले अपने 'models.py' और' views.py' लिए, https देखें: //docs.djangoproject। कॉम/एन/देव/कैसे/कस्टम-टेम्पलेट-टैग/ –

+0

ग्रेट, यह भी काम करता है! और यह बाद में चीजों को सरल बनाता है। एक बात, यद्यपि। मुझे इसे सुरक्षित करने के लिए 'सुरक्षित' (यानी {{टैग | jsonify | सुरक्षित}} 'पर एक अतिरिक्त पाइप जोड़ना पड़ा था। शायद यह मेरे ऑब्जेक्ट के साथ कुछ करने के लिए है। – DefPlayr

2

तुम भी django.utils से simplejson उपयोग कर सकते हैं। पसंद:

oldAnnotations = lastFrame.videoannotation_set.filter(ParentVideoLabel=label) 
dump = simplejson.dumps(oldAnnotations) 

return HttpResponse(dump, mimetype='application/json') 

आप जेएस पक्ष से इस डेटा को पार्स और एक्सेस कर सकते हैं।

+4

में [Django 1.5] अब मान्य नहीं है यही कारण है कि (https:।। //docs.djangoproject .com/एन/dev/विज्ञप्ति/1.5/# प्रणाली संस्करण के- simplejson-न अब इस्तेमाल किया) – Ngenator

संबंधित मुद्दे