1

您好我正在尝试使用 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 %}
4

2 回答 2

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

这是最干净的方法。

于 2012-08-12T20:31:20.270 回答
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。

有一些 stackoverflow 问题回答了此处使用哪个问题:

推荐用于 JQuery 的 JavaScript HTML 模板库?

jQuery 的首选模板库是什么?

为了找到有关此的更多信息,您需要搜索“javascript 模板”。

于 2012-08-12T20:34:52.000 回答