使用Django实现Ajax视图

3

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

2个回答

6
这篇文章似乎是一份关于如何处理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的RESTful框架django-piston。我在我的项目中使用这个模块。您可以定义资源(类似于视图),并根据传递到您的URL的mime类型或格式,它将发出html、xml或json。如果每个视图(或大多数)需要以不同的格式返回,则这可能是最好的方法。

这已经是常见的方法了,我正在寻找不必在视图中反复切换ajax / non-ajax请求的好方法... - Bernhard Vallant
@lazer 请看我的回答末尾,其中讲到了django-piston。它允许您根据MIME类型或URL参数返回不同的响应。 - Josh Smeaton
+1 对于活塞的想法,它已经是项目的一部分,但它只被用作“正常”使用的 REST API。 - Bernhard Vallant
@lazer 这就是 Piston 的好处,它不仅适用于 JSON/XML 响应,如果 MIME 类型为 text/html,它也可以很愉快地返回 HTML。 =P - Josh Smeaton
2
文章链接坏了吗? - Philip007

0
我已经使用了一个装饰器来实现这个功能。让视图返回上下文、模板和另一个备用模板。
如果 Ajax 版本想要返回数据,第三个返回值可以是数据对象,以转换为 JSON。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接