在Django中序列化字典以与Dajaxice或ajax一起使用

时间:2010-09-22 09:03:11

标签: ajax django json

我正在尝试编写监控站点,以便某些设备的温度每x秒更新一次。到目前为止,我有一个使用dajaxice返回字典的函数。这是我的ajax.py:

def temperature(request):
  temperature_dict = {}
  for filter_device in TemperatureDevices.objects.all():
    get_objects = TemperatureData.objects.filter(Device=filter_device)
    current_object = get_objects.latest('Date')
    current_data = current_object.Data
    temperature_dict[filter_device] = current_data 
  table = str(temperature_dict)
  return simplejson.dumps({'table':table})

这是我的回调:

function my_callback(data){
    if(data!=Dajaxice.EXCEPTION){

       document.getElementById('test').innerHTML = data.table;
    }
    else{
        alert('Error');
    }
}
Dajaxice.toolbox.monitor.temperature('my_callback');

最初,我的HTML看起来像这样:

<div id="test"> <tr>
{% for label, value in table %}
      <td>{{ label }}
      </td>
      <td>{{ value }}
      </td>
{% endfor %}
    </tr></div>

我怎么能写这个所以我可以遍历我在dajax中获得的字典,以便输出类似于我在原始html中使用django时的输出?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我正在使用“仅使用Django”部分来表示您对使用JavaScript生成必要的DOM对象以插入页面不感兴趣。

因此,我的第一个想法是拥有一个Django模板,您可以在视图中呈现并返回JSON。例如,假设您有一个名为“_data_table.html”的模板:

<tr>
{% for label, value in table %}
<td>{{ label }}</td>
<td>{{ value }}</td>
{% endfor %}
</tr>

您的原始HTML可以修改为如下所示:

<div id="test">
{% include '_data_table.html' %}
</div>

您可以将视图更改为以下内容:

from django.template.loader import render_to_string

def temperature(request):
    temperature_dict = {}
    for filter_device in TemperatureDevices.objects.all():
        get_objects = TemperatureData.objects.filter(Device=filter_device)
        current_object = get_objects.latest('Date')
        current_data = current_object.Data
        temperature_dict[filter_device] = current_data

    table = render_to_string('_data_table.html', {'table': temperature_dict})
    return simplejson.dumps({'table': table})

注意:这是未经测试的代码:)