javascript - Django से जावास्क्रिप्ट डोम तक वस्तुओं को पास करना




python json dom (9)

मैं Django से जावास्क्रिप्ट के साथ एक टेम्पलेट में एक क्वेरी सेट पास करने की कोशिश कर रहा हूँ।

मैंने इसे हल करने के लिए विभिन्न दृष्टिकोणों का प्रयास किया है:

1. सामान्य दृष्टिकोण - नामकरण की वजह से ऑब्जेक्ट को पार्स करने की कोशिश करने के साथ जावास्क्रिप्ट सभी गड़बड़ हो जाता है [& gt ऑब्जेक्ट: आईडी और लेफ्टिनेंट, & gt ऑब्जेक्ट: आईडी और लेफ्टिनेंट, ...]

Django देखें

django_list = list(Some_Object.objects.all())

टेम्पलेट एचटीएमएल + जेएस

<script type="text/javascript" >
    var js_list = {{django_list}};
</script>

2. JSON दृष्टिकोण - Django ऑब्जेक्ट सूची को जेसन स्ट्रिंग में कनवर्ट करने में विफल रहता है JSON serializable नहीं है

Django देखें

django_list = list(Some_Object.objects.all())
json_list = simplejson.dumps(django_list)

टेम्पलेट एचटीएमएल + जेएस

<script type="text/javascript" >
    var js_list = {{json_list}};
</script>

तो, मुझे यहां कुछ मदद की ज़रूरत है :)

किसी के पास कोई सुझाव / समाधान है?

धन्यवाद!


Answers

संपादित करें: कृपया इस विधि का उपयोग न करें, @ agconti का उत्तर देखें।

Escapejs फ़िल्टर का उपयोग करें: https://docs.djangoproject.com/en/1.4/ref/templates/builtins/#escapejs

सूची को डंप करने का उदाहरण:

var foo = [{% for x in y %}'{{ x|escapejs }}',{% endfor %}]

आपकी समस्या यह है कि, अक्सर, आपकी आवश्यकताओं को निर्दिष्ट नहीं किया जाता है। आप जेएसओएन की तरह दिखने के लिए वास्तव में क्या चाहते हैं? आप कहते हैं कि आप "क्वेरीसेट को क्रमबद्ध करना" चाहते हैं, लेकिन किस प्रारूप में? क्या आप प्रत्येक मॉडल उदाहरण, चयन, या सिर्फ यूनिकोड प्रतिनिधित्व से सभी फ़ील्ड चाहते हैं? जब आपने उस प्रश्न का उत्तर दिया है, तो आपको पता चलेगा कि आपकी समस्या का समाधान कैसे करें।

उदाहरण के लिए, एक दृष्टिकोण, प्रत्येक उदाहरण के लिए फ़ील्ड के शब्दकोश को आउटपुट करने के लिए values क्वेरीसेट विधि का उपयोग करना हो सकता है, और उसे क्रमबद्ध करें (आपको इसे पहले सूची में परिवर्तित करने की आवश्यकता है):

data = SomeObject.objects.values('field1', 'field2', 'field3')
serialized_data = simplejson.dumps(list(data))

समेकित उत्तर (मेरा env: Django 2.0)

Views में

import json
data= []
// fil the list
context['mydata'] = json.dumps({'data':data})

टेम्पलेट में

  <script type="text/javascript">
      var mydataString = "{{mydata|escapejs}}";
      console.log(JSON.parse(mydataString));
  </script>

वही प्रश्न, "बेहतर" ( अधिक हालिया ) उत्तर: जेसन में उपयोग के लिए डैंजो क्वेरीसेट का उपयोग करने के लिए

vashishtha-jogi द्वारा उत्तर:

DjangoJSONEncoder का उपयोग करना बेहतर तरीका है। यह दशमलव के लिए समर्थन है।

import json
from django.core.serializers.json import DjangoJSONEncoder

prices = Price.objects.filter(product=product).values_list('price','valid_from')

prices_json = json.dumps(list(prices), cls=DjangoJSONEncoder)

उपयोग करने के लिए बहुत आसान है। अलग-अलग क्षेत्रों को फ्लोट करने के लिए हुप्स के माध्यम से कोई कूद नहीं।

अद्यतन: Simplejson के बजाय बिल्टिन जेसन का उपयोग करने के लिए उत्तर बदल दिया।

यह उत्तर मेरी Google खोजों में अक्सर आया है और इसमें इतने सारे विचार हैं कि ऐसा लगता है कि इसे अपडेट करना और किसी और को एसओ के माध्यम से खोदने से बचाने का अच्छा विचार है। Django 1.5 मानता है।


Django क्वेरीसेट जेएसओएन द्वारा serializable हैं । कुछ फ़ील्ड प्रकार (जैसे कि तिथि, स्पष्ट रूप से), को क्रमबद्ध नहीं किया जा सकता है। जेएसओएन और पायथन पर किसी अन्य प्रश्न में डेट ऑब्जेक्ट्स के लिए एक वर्कअराउंड पोस्ट किया गया है।

मैं सीधे जावास्क्रिप्ट में शब्दकोश बनाने की सिफारिश करता हूं। इस तरह के मॉडल दिए गए हैं:

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField()
    content = models.TextField()

class Author(models.Model):
    article = models.ForeignKey("Article", related_name="authors")
    first_name=models.CharField(max_length=100)
    last_name=models.CharField(max_length=100)

मैं टेम्पलेट में ऐसा कुछ करूंगा:

<script type="text/javascript">
    var articles = [
    {% for article in article_list %}
        {% if not forloop.first %},{% endif %}
        {
            title: "{{ article.title }}",
            slug: "{{ article.slug }}",
            content: "{{ article.content }}",
            authors: [
            {% for author in article.authors.all %}
                {% if not forloop.first %},{% endif %}
                {
                    first_name: "{{ author.first_name }}",
                    last_name: "{{ author.last_name }}",
                }
            {% endfor %}
            ]
        }
    {% endfor %}
    ]
</script>

यदि आपने शायद प्रश्न को थोड़ा खराब कहा है और <script> टैग में कोड डालने की योजना नहीं बना रहे हैं और वास्तव में किसी कारण से JSON की आवश्यकता है , तो मैं बस दृश्य में एक लूप करता हूं और dict s की एक सूची बना देता हूं, जेएसओएन को क्रमबद्ध करने में कोई समस्या नहीं है, और जावास्क्रिप्ट को समझने में कोई समस्या नहीं है।


आप Django में अंतर्निर्मित फ़िल्टर के safe और escapejs के संयोजन का उपयोग कर सकते हैं।

var json_string = unescape({{json_list | safe | escapejs}});
var json_data = JSON.parse(json_string);

Django उस परिदृश्य के लिए अंतर्निर्मित सहायता प्रदान करता है जिसे आप यहां करने का प्रयास कर रहे हैं। यह कुछ इस तरह चलता है:

आपके पास अपने दृश्य में एक अजगर अनुक्रम, सूची, शब्दकोश, आदि है, चलिए इसे py_object कहते हैं। एक दृष्टिकोण यह है कि इसे प्रतिपादन इंजन में पास करने से पहले इसे समझना है।

from django.shortcuts import render_to_response
import json  

फिर बाद में इस तरह उपयोग पर ...

render_to_response('mypage.html',{'js_object':json.dumps(py_object)})

आपके टेम्पलेट में, फिर से पहले से जेएसनाइज्ड ऑब्जेक्ट को पाइथन से जावास्क्रिप्ट में आयात करने के लिए safe फ़िल्टर का उपयोग करें, इस तरह ...

data = {{ js_object|safe }}

मुझे उम्मीद है कि आपकी समस्या को हल करना चाहिए।


यह सुनिश्चित करने के लिए कि स्ट्रिंग से बच नहीं है, आपको स्ट्रिंग को सुरक्षित रूप से चिह्नित करना होगा।

मेरी परियोजना में से एक में मैं इसे इस तरह उपयोग करता हूं:

# app/templatetag/jsonify.py
from django import template
from django.utils.safestring import mark_safe
import json

register = template.Library()

@register.filter
def jsonify(list):
    return mark_safe(json.dumps(list))

और टेम्पलेट में

{% load jsonify %}
<script type="text/javascript" >
    var js_list = {{ python_list|jsonify|escapejs }};
</script>

लेकिन आप सभी &gt; से बचने के लिए टेम्पलेट में mark_safe या use | सुरक्षित को जोड़ना पसंद कर सकते हैं &gt; सामग्री

यदि समस्या जटिल पायथन ऑब्जेक्ट को संभालने के लिए है तो आपको इस तरह अपना हैंडलर करना होगा: जेसन डेटाटाइम पाइथन और जावास्क्रिप्ट के बीच


var index = haystack.indexOf(needle);




javascript python django json dom