2012-08-12 41 views
1

嗨我试图使用AJAX从我的数据库显示主题名称。 这是我的输出现在:如何使用Ajax将输出数据与Django模板中的django模型分开使用Ajax

[{"pk": 1, "model": "school.subjects", "fields": {"name": "Math 140"}}, 
{"pk": 2, "model": "school.subjects", "fields": {"name": "English 102"}}, 
{"pk": 3, "model": "school.subjects", "fields": {"name": "CS210"}}] 

但我只想显示:我怎样才能做到这一点?

Math 140 
English 102 
CS210 

这就是我的观点:

@csrf_exempt 
def subjects_list(request): 
    if request.is_ajax(): 
     user = request.user 
     subjects = Subjects.objects.filter(user__exact = user) 
     result = serializers.serialize("json", subjects, fields=('name')) 
    else: 
     result = "blablabl" 
    return HttpResponse(result) 

而这就是我的test.html

{% extends "base.html" %} 
{% block main-menu %} 
    <div id="result"></div> 
    <script type="text/javascript"> 
     $(function() { 
      $.get("/subjects-list", function(data){ 
       $("#result").append(data); 
      }); 
     }); 
    </script> 
{% endblock %} 

回答

1

这是因为从服务器返回的数据是JSON。这需要在将它加载到DOM中之前进行解析。你可以做这样的事情:

复制,然后添加到您的的test.html ...

{% extends "base.html" %} 
{% block main-menu %} 
    <div id="result"></div> 
    <script type="text/javascript"> 
     $(function() { 
      $.get("/subjects-list", function(data){ 
       var $results = $("#result"); 
       for (var i = 0; i < data.length; i++) { 
        $results.append(data[i]["fields"]["name"] + "<br/>"); 
       } 
      }, "json"); 
     }); 
    </script> 
{% endblock %} 

随着中说,虽然,你可能要考虑使用JavaScript模板化图书馆。那里有很多。总体思路是库可以处理将AJAX响应转换为HTML。

有一些计算器答疑其中使用这里的问题是:

Recommended JavaScript HTML template library for JQuery?

What is the preferred template library for jQuery?

为了找到更多关于这一点,你要搜索“的JavaScript模板”。

+0

WOW!非常感谢!这非常干净和容易! – Vor 2012-08-12 20:37:38

+0

它工作正常,但只是想问为什么我需要这一行:var $ results = $(“#results”); ??? – Vor 2012-08-12 20:41:57

+0

哎呀,我只是编辑它,所以它实际上使用该变量:P – almostflan 2012-08-12 20:43:47

1

不要直接序列化你的模型,它是不是安全的,因为用户将看到明智的内部领域。

您想使用真实的API引擎,如django-tastypiedjango-piston。有了这种发动机,你就可以选择要显示的字段,管理权限,输出格式等...

例如,对于tastypie

class SubjectResource(ModelResource): 
    class Meta: 
     queryset = Subject.objects.all() 
     resource_name = 'subjects' 
     fields = ['name'] 

会产生:

{ 
    "objects": [ 
    {"name": "Math 140"}, 
    {"name": "English 102"}, 
    {"name": "CS210"}, 
    ] 
} 

当然,你可以用下面的实例方法删除objects包装:

def alter_list_data_to_serialize(self, request, data): 
    data[self.Meta.resource_name] = data['objects'] 
    del data['objects'] 
    del data['meta'] 
    return data 

这是最干净的方式。

+0

谢谢你的完美答案,我现在就试试 – Vor 2012-08-12 20:33:54