这使用Django和Python 2.5。我有一个dicts列表,我想在视图中写入模板变量,并且能够在提交表单时恢复列表。我只能做一个或另一个。
当我使用带有dicts列表的render_to_response时,我可以使用模板中的值,但键是单引号的,因此simplejson.loads失败。如果我在render_to_response之前使用simplejson.dump转换dicts列表,我可以使用加载恢复列表,但模板会将变量视为字符串。
要同时使用模板中的变量并稍后恢复列表,我需要在视图中写入两个输入。好像我错过了什么。
这是一个例子。
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>
答案 0 :(得分:1)
我不确定你为什么认为自己错过了什么。 JSON是一种文本交换格式。如果将dict转储到JSON,它将转换为字符串,并且您无法遍历其项目。如果您只是将字典输出为字符串,则它将不是有效的JSON。 Python的字典文字格式接近于JSON,但不完全相同。
答案 1 :(得分:1)
如何创建一个模板标签,用于将字典转换为模板中的JSON字符串?自定义模板标签非常强大,而且编写起来非常简单。更多信息here。
答案 2 :(得分:1)
为什么首先将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
并相应地处理失败,只是为了安全。