使用django的Ajax视图

时间:2011-01-19 20:48:19

标签: ajax django django-views decorator django-generic-views

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

2 个答案:

答案 0 :(得分:6)

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。如果需要以不同的格式返回每个视图(或大多数视图),这可能是最好的方法。

答案 1 :(得分:0)

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

如果Ajax版本想要返回数据,则第三个返回值可以是要转换为JSON的数据对象。