2012-03-20 2 views
0

이것은 Django와 Python 2.5를 사용합니다. 템플릿 변수에 뷰에 쓰고 양식을 제출할 때 목록을 복구 할 수있는 목록 목록이 있습니다. 나는 둘 중 하나만 할 수있다.Django는 JSON을 입력에 쓰고 템플릿에서 사용하고 읽을 수 있습니까?

dicts 목록에서 render_to_response를 사용할 때 템플릿의 값을 사용할 수 있지만 키는 작은 따옴표로 묶어 simplejson.loads가 실패합니다. render_to_response 전에 simplejson.dumps를 사용하여 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> 

답변

1

난 당신이 당신이 뭔가를 누락 생각하는 이유를 모르겠어요. JSON은 텍스트 교환 형식입니다. dict을 JSON으로 덤프하면 문자열로 변환되고 항목을 반복 할 수 없습니다. 사전을 단순히 문자열로 출력하면 유효한 JSON이 아닙니다. 파이썬의 사전 리터럴 형식은 JSON에 가깝지만 완전히 동일하지는 않습니다.

+0

나는 이것이 일에 너무 가깝기 때문에 뭔가를 놓친다 고 생각했다. 그것은 1) django가 작은 따옴표로 핵심 따옴표를 강제하지 않고 이중 따옴표를 만든 다음 2) 사용하는 큰 따옴표 대신 HTML 값에 작은 따옴표를 사용하면 효과가 있습니다. – Mitch

1

사전을 템플릿 내에서 JSON 문자열로 변환하기위한 templatetag를 만드는 방법은 어떻습니까? 사용자 정의 템플릿 태그는 매우 강력하고 놀랍도록 쉽게 작성할 수 있습니다. 더 많은 정보 here.

1

왜 json을 처음에 템플릿에 보냅니 까?

당신은 또한 루프

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

의를 사용하여 템플릿에서 사전에서 렌더링 할 수 - 당신은 자신에게 다시 보낼 수 있습니다 단지 있도록 다시 웹 페이지에서 JSON 및 저장에 인코딩하지 않습니다 -이 어떤 세션 (또는 메시지)을위한 것입니까? 귀하의 의견이 수행 다음 뷰에

request.session['mydict'] = my_dictionary 

을, 당신은 단순히 것으로, 그래도 난 확인 'mydict' in request.session을하고 그에 따라 오류를 처리하기 위해 확인 좋을 것

request.session['mydict'] 

와 사전을 복구 할 수 있습니다 안전한.

+0

세션에 있으면 숨겨집니다. 명시 적으로 되돌려 보내면 URL에서보기를 다시 작성할 수 있습니다. – Mitch

+0

왜 같은 데이터를 사용하는 대신 URL에서 뷰를 다시 만들고 싶습니까? 숨겨진 것에 관해서는, 당신은 무엇을 의미합니까? 원하는 경우 대화 상자를 사용자에게 렌더링하고 세션에서 동일한 사본을 유지함으로써 불필요하게 앞뒤로 보내는 대역폭을 둘 다 절약 할 수 있습니다. 어쩌면 당신이 그것을 사용하고 있는지 이해하지 못할 수도 있습니다. –

+0

예를 들어 티켓 구매를 고려하십시오.1 단계 (보기 1)에서 티켓은 예약되어 있으며 사용자가 확인합니다. 2 단계 (보기 2)에서 그는 구매합니다. 2 단계에서 티켓이 무엇인지 알고 싶습니다. 세션을 사용하면 문제가 없으며 불필요하게 데이터를 전송하는 것이 좋습니다. 그러나 URL에 데이터가 완전히 지정되어있는 것이 잠재적 이점 (아마도 단지 이데올로기적임 - REST?)이 있다고 생각했습니다. – Mitch

관련 문제