Может ли Django записать JSON на вход и использовать его в шаблоне, а также прочитать его обратно? - PullRequest
0 голосов
/ 20 марта 2012

Используется Django с Python 2.5.У меня есть список запросов, которые я хочу записать в переменную шаблона в представлении, а также иметь возможность восстановить список при отправке формы.Я могу сделать только одно или другое.

Когда я использую render_to_response со списком диктов, я могу использовать значение в шаблоне, но ключи заключаются в одинарные кавычки, поэтому simplejson.loads завершается ошибкой.Если я преобразую список диктов с помощью simplejson.dumps перед render_to_response, я могу восстановить список с нагрузками, но шаблон видит переменную как строку.

Чтобы использовать переменную в шаблоне и восстановить списокпозже мне нужно написать два входа в представлении.Кажется, я что-то упускаю.

Вот пример.

test.py:

from django.shortcuts import render_to_response
from django.utils import simplejson

def test(request):
    test_dict_list = [{'a': 1, 'b': 2, 'c': 3}, {'d1': 4,'e2': 5}]
    test_dict_list_json = simplejson.dumps(test_dict_list)

    str1 = request.GET.get("test_dict_list")
    # u"[{'a': 1, 'c': 3, 'b': 2}, {'e2': 5, 'd1': 4}]"

    try:
        simplejson.loads(str1)
        # fails because keys are single-quoted
    except:
        pass

    str2 = request.GET.get("test_dict_list_json")
    # u'[{"a": 1, "c": 3, "b": 2}, {"e2": 5, "d1": 4}]'

    try:
        list1 = simplejson.loads(str2)
    # correct list of dicts since  keys are double quoted
    # [{u'a': 1, u'c': 3, u'b': 2}, {u'd1': 4, u'e2': 5}]
    except:
        pass

    return render_to_response('testview.html',
                               {'test_dict_list': test_dict_list,
                                'test_dict_list_json': test_dict_list_json})

testview.html:

<h1>Testing</h1>

<form name="test_form" action="{% url test %}" method="get">
    <h3>test_dict_list = {{ test_dict_list }}</h3>
    {% for elt in test_dict_list %}
        <ul>{{ elt }}</ul>
    {% endfor %}

    <h3>test_dict_list_json = {{ test_dict_list_json }}</h3>
    {% for elt in test_dict_list_json %}
        <ul>{{ elt }}</ul>
    {% endfor %}

    <input name="test_submit" type="submit" class="cpa-button" value="Test submit"/>

    {# Invisible input to store persistent values across page loads #}
    <input name="test_dict_list" type="text" style="display:none" value="{{ test_dict_list }}"/>
    <input name="test_dict_list_json" type="text" style="display:none" value="{{ test_dict_list_json }}"/>

</form>

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Как насчет создания тега шаблона для преобразования словаря в строку JSON из шаблона? Пользовательские теги шаблонов очень мощные и на удивление легко пишутся. Подробнее здесь .

1 голос
/ 20 марта 2012

Почему вы отправляете json в шаблон в первую очередь?

Вы можете выполнить рендеринг из словаря в шаблоне, используя цикл for

{% for key,value in my_dictionary.items %}
    <li>{{key}}:{{value}}</li>
{% endfor %}

Более того - не кодироватьjson и сохранить на веб-странице, чтобы вы могли снова отправить ее себе - для этого нужны сеансы (или сообщения).В ваших представлениях сделайте следующее:

request.session['mydict'] = my_dictionary

В следующем представлении вы можете просто восстановить словарь с помощью

request.session['mydict']

Я бы предложил проверить, чтобы убедиться, что 'mydict' in request.session хотя и обрабатыватьнеудача соответственно, просто чтобы быть в безопасности.

1 голос
/ 20 марта 2012

Я не уверен, почему вы думаете, что что-то упустили.JSON - это формат обмена текстами.Если вы выгружаете dict в JSON, он преобразуется в строку, и вы не можете перебирать его элементы.Если вы просто выводите словарь в виде строки, он не будет действительным JSON.Литеральный формат словаря Python близок к JSON, но не совсем тот же.

...