Используется 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>