如何将查询集从django传递给javascript函数?

时间:2016-08-24 12:28:47

标签: javascript json django

我想通过模板将查询集从视图传递到javascript函数:

我的view.py

def myview(request):    
    lista=Mymodel.objects.filter(tipo=mytipo)
    context_dict['lista']=lista
    return render(request, 'mytemplate.html', context_dict)

我的template.html

  <script>
  <!--
    window.onpageshow = function() {
      myfunction('{{lista}}');
    };
  -->
  </script>

我的javascript.js

function myfunction(lista) {
  for (i=0; i<lista.length; i++) {
              console.log(lista[i].name)
  }
}

问题是lista成为字符串。我尝试使用JSONEncoder,但我不确定如何使用。我想避免使用JsonResponse,因为我想将该视图用于我的模板(如果可能的话)。

修改:

答案中提出的解决方案存在问题:

TypeError: Python object is not JSON serializable

并且this link中提出的解决方案也不起作用(无法找到_meta调用的model_to_dict属性。

JSON.parse不起作用

SyntaxError: missing ) after argument list

问题似乎是在一条路径和另一条路径之间:

myfunction(JSON.parse('['/mypath/myimage.png', '/otherpath/otherimage.png', 'etc... ']'));

同样在模板中,您必须添加|safe

幸运的是我需要一个字符串列表,所以:

我的view.py

def myview(request):    
    lista=Mymodel.objects.filter(tipo=mytipo)
    lista_formatted=[]
    for elem in lista:
        lista_formatted.append('/media/'+str(elem.myfield))
    lista_formatted=json.dumps(lista_formatted)
    context_dict['lista']=lista_formatted
    return render(request, 'mytemplate.html', context_dict)

我的template.html

  <script>
  <!--
    window.onpageshow = function() {
      myfunction({{lista|safe}});
    };
  -->
  </script>

1 个答案:

答案 0 :(得分:4)

更改

下面的一行
context_dict['lista']=json.dumps(lista) //note json.dumps() wraps it

删除此处的引号:

<script>
     <!--
    window.onpageshow = function() {
      myfunction({{lista}});//<--quote removed!
    };
-->
</script>