【问题标题】:How to separate output data from django models in Django template, using Ajax如何使用 Ajax 在 Django 模板中从 django 模型中分离输出数据
【发布时间】:2012-08-09 03:53:12
【问题描述】:

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

【问题讨论】:

    标签: ajax django django-templates django-views


    【解决方案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问题回答了使用哪个问题:

    Recommended JavaScript HTML template library for JQuery?

    What is the preferred template library for jQuery?

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

    【讨论】:

    • 它工作正常,但只是想问我为什么需要这一行: var $results = $("#results"); ???
    • 这个想法是每次你说 $("...."),jquery 都会去搜索项目。如果你把它存储在一个变量中,它只需要搜索一次。
    • 哦,我明白了,所以它基本上提高了性能。谢谢。
    • 正确。我相信它在 JQuery 的最佳实践中的某个地方,但我找不到链接。调用 JQuery 选择器变量 $foo 是惯例。
    【解决方案2】:

    不要直接序列化你的模型,这不安全,因为用户会看到合理的内部字段。

    您想使用真正的 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
    

    这是最干净的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 2012-06-10
      • 2013-09-01
      • 2020-07-26
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多