Django可以将JSON写入输入并在模板中使用它并将其读回来吗?

时间:2012-03-20 03:30:09

标签: django django-templates django-views

这使用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>

3 个答案:

答案 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并相应地处理失败,只是为了安全。