Передача данных JSON во внешний интерфейс с помощью Django - PullRequest
5 голосов
/ 11 августа 2011

Есть ли способ передать объекты JSON во внешний интерфейс веб-шаблона, если используется инфраструктура Django или Python в целом?

Например, если я хочу отправить объект с двумя массивами в качестве свойств (скажем, xvalues и yvalues), как я смогу использовать JavaScript или jQuery для выполнения вызова Ajax для получения объекта что имеет свойства?

Ответы [ 4 ]

6 голосов
/ 11 августа 2011

Конечно, просто установите представление, которое возвращает JSON, и сделайте запрос к нему Вот простой пример:

import json      
from django.http import HttpResponse
from django.template import Template, Context

def ajax(request):
    """returns json response"""
    return HttpResponse(json.dumps({'foo': 'bar'}), mimetype='application/json')

def index(request):
    """simple index page which uses jquery to make a single get request to /ajax, alerting the value of foo"""
    t = Template("""
    <!doctype html>
      <head>
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
       <script type="text/javascript">
         $.get('/ajax/', function(data) {
           alert(data['foo']);
         });
       </script>
     </head>
    </html>""")
    return HttpResponse(t.render(Context()))

# urlconf
urlpatterns = patterns('',
    (r'^$', index),
    (r'^ajax/', ajax),
)
4 голосов
/ 11 августа 2011

Если я вас правильно понимаю, вы хотите визуализировать некоторый JSON в выводе HTML.

Для этого передайте объект в кодировке json из представления в шаблон:

views.py:

import json

def myview(request):
    obj = {"a": 1, "b": 2}
    return render_to_response("template.html", {"obj_as_json": json.dumps(obj)})

template.html:

<html>
    <head>
    <script type="text/javascript">
    var obj = {{ obj_as_json }};
    </script>
    </head>
    ...
</html>

Будет отображаться как:

...
<script type="text/javascript">
var obj = {"a": 1, "b": 2};
...

Обратите внимание, что json.dumps работает только со словарями, содержащими простые данныетипы.Django поддерживает сериализацию объектов модели в json, используя:

from django.core import serializers
obj_as_json = serializers.serialize("json", my_model_object)
4 голосов
/ 11 августа 2011

Дополнение ответа Zeekay, если вы хотите отправить только объект, вы можете сделать JSON-дамп, например:

import json

def my_ajax_view(request):
    if not request.is_ajax():
        raise Http404

    data_dict = getmydata() #lets supose is a dict
    return HttpResponse(json.dumps(data_dict))

Таким образом, вы получите эти данные через ваш ajax-успех и будете делать с ним все, что захотите.

Вы также можете отправлять списки, когда вы получаете ответ, иногда вам нужно выполнить JSON.parse для данных (иногда это происходит, когда вы отправляете словарь, я думаю, что это не нужно)

1 голос
/ 26 января 2019

К сожалению, настоящие ответы немного устарели, вот как это сделать с более свежими версиями Django (включая Django> 2.0 ):

Используйте JsonResponse , подкласс HttpResponse , для этого:

# views.py
from django.http import JsonResponse

def get_coords(request):
    """returns json response"""
    json_data = {'xval': 10, 'yval': 10}
    return JsonResponse(json_data)

Он принимает dict в качестве параметра, но в принципе вы можете передать любой JSON-сериализуемый. Я бы не рекомендовал вам этого делать, но если вы передаете объект, который не является dict, вам нужно установить параметр safe=False.

Ajax-запрос может выглядеть примерно так:

# index.html
...
<head>
...
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
    $.get("{% url 'ajax_get_coords' %}", function(data) {
        var xval = data.xval;
        var yval = data.yval;
        ...
    });
</script>
...

С соответствующим urlconfig:

# urls.py

urlpatterns = [
   path('ajax_coords/', views.get_coords, name='ajax_get_coords'),
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...