Django 的 Ajax 视图

Posted

技术标签:

【中文标题】Django 的 Ajax 视图【英文标题】:Ajax views with django 【发布时间】:2011-06-12 01:15:10 【问题描述】:

我现在正在做一个相当大的项目,每个视图都应该可以通过普通请求和 ajax 请求通过相同的 url 访问。我正在寻找有关如何创建一个小框架以非常通用的方式处理此问题的想法。根据是否通过 ajax 调用视图,它需要呈现不同的模板并返回 json 而不是 HttpResponse 对象。我想收集关于这个主题的任何想法 - 主要目标不应该是避免干原则,并使代码尽可能可重用。我已经在考虑不同的选项,如通用视图、视图装饰器等,但我对任何事情都持开放态度。因此,请让我听听您的建议或向我介绍您知道的任何现成的 sn-ps!

【问题讨论】:

【参考方案1】:

我为此使用了装饰器。让视图返回上下文、模板和备用模板。

如果Ajax版本要返回数据,第三个返回值可以是数据对象转成JSON。

【讨论】:

【参考方案2】:

This article 似乎是一个关于如何使用 ajax 和常规请求的很好的教程。 request 对象有一个方法is_ajax(),它将寻找HTTP_X_REQUESTED_WITH: XMLHttpRequest。这当然取决于发送请求的 javascript 是否正确设置了这些值。

来自文章:

from django.http import HttpResponse
from django.core import serializers
from django.shortcuts import render_to_response
from your_app.models import ExampleModel

def xhr_test(request, format):
    obj = ExampleModel.objects.all()
    if request.is_ajax():
        data = serializers.serialize('json', obj)
        return HttpResponse(data,'json')
    else:
        return render_to_response('template.html', 'obj':obj, context=...)

或者,您可以使用django-piston,它是 Django 的 RESTful 框架。我在我的项目中使用这个模块。您可以定义资源(类似于视图),并且根据传递给您的 url 的 mime 类型或格式,它将发出 html、xml 或 json。如果每个视图(或大部分视图)都需要以不同的格式返回,这可能是最好的方法。

【讨论】:

嗯,这已经是常见的方法了,我正在寻找一些不错的方法来不必总是在视图中重复 ajax/非 ajax 请求之间的切换...... @lazer 看到我关于 django-piston 的回答的结尾。这允许您根据 mime-type 或 url 参数返回不同的响应。 +1 表示活塞的想法已经是项目的一部分,但它仅用作“正常”使用的休息 api.. @lazer 这是关于活塞的好处,它不仅适用于 JSON/XML 响应。如果 mime-type 是 text/html =P,它也可以很高兴地返回 HTML 文章链接失效了?

以上是关于Django 的 Ajax 视图的主要内容,如果未能解决你的问题,请参考以下文章

django ajax 代理视图

从 Ajax 调用 Django 视图

Django & Ajax - 没有返回语句的视图

使用基于类的视图和 ajax 的 Django 应用程序?

django使用模板视图和ajax

使用 ajax 时,Django 视图不呈现模板