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

使用基于类的视图和ajax的Django应用程序?,ajax,django,django-class-based-views,Ajax,Django,Django Class Based Views,我正在学习Django,我发现了基于类的视图,我想知道如何在这些视图上实现Ajax 我在github中搜索了一个django项目,发现一些项目使用基于类的视图,但没有使用ajax 所以。。。有人知道一个同时使用这两种东西的开源项目吗?那样更容易学 谢谢:)ajax视图与普通视图没有太大区别,只是在处理普通请求时通常希望返回不同的格式。这种格式通常是JSON 文档中有一个mixin示例,可用于返回JSON,因此这是一个很好的起点: 您希望视图回复普通请求还是只处理AJAX请求?如果是前者,唯一的

我正在学习Django,我发现了基于类的视图,我想知道如何在这些视图上实现Ajax

我在github中搜索了一个django项目,发现一些项目使用基于类的视图,但没有使用ajax

所以。。。有人知道一个同时使用这两种东西的开源项目吗?那样更容易学


谢谢:)

ajax视图与普通视图没有太大区别,只是在处理普通请求时通常希望返回不同的格式。这种格式通常是JSON

文档中有一个mixin示例,可用于返回JSON,因此这是一个很好的起点:


您希望视图回复普通请求还是只处理AJAX请求?如果是前者,唯一的技巧就是在render_to_响应方法中写入一个小检查,以拒绝任何正常的GET请求。如果是后者,上面的链接将继续讨论一种情况,您可以创建一个视图来处理ajax请求和普通请求

如果不使用流行的dajaxic和dajax包,这仍然是一件简单的事情

为请求对象编写一个decorator将有助于django的is_ajax()函数包装起来,如下所示:

def ajax_request(function):
    def wrapper(request, *args, **kwargs):
        if not request.is_ajax():
            return render_to_response('error/ajax_required.html', {},
                context_instance=RequestContext(request))
        else:
            return function(request, *args, **kwargs)
    return wrapper
假设需要一个名为ajax_的模板来处理此特定故障。这样做可以防止用户在浏览器中输入特定于ajax的url,如果您不希望这样做的话

由于这是一个较短的示例,下面是一个呈现模板的基于类的ajax视图

from django.views.generic.base import TemplateView

class AjaxGeneral(TemplateView):
    template_name= None
    def get(self, request):
        data={}
        return render_to_response(self.template_name, data,
            context_instance=RequestContext(request))

    @method_decorator(ajax_request)
    def dispatch(self, *args, **kwargs):
        return super(AjaxGeneral, self).dispatch(*args, **kwargs)
现在,对于只需要呈现html片段的所有ajax,您可以定义基于类的简短视图,如:

class ShowSomeTable(AjaxGeneral):
    template_name="some_table.html"
假设某个_table.html中有一些html片段

现在,此视图的URL.py条目如下所示:

url(r'showtable/$', ShowSomeTable.as_view()),
您可以在js中正常调用它,如:

$(#dynamic-content).load('/showtable');

如果您想同时支持AJAX和传统视图,可以向CreateView中添加如下内容:

# at top of file
from django.http import JSONResponse  

# inside CreateView class
def render_to_response(self, context, **response_kwargs):
    """ Allow AJAX requests to be handled more gracefully """
    if self.request.is_ajax():
        return JSONResponse('Success',safe=False, **response_kwargs)
    else:
        return super(CreateView,self).render_to_response(context, **response_kwargs)

这通常会处理常规视图(带有重定向等),但对于AJAX,它会返回JSONResponse。如果返回“成功”,您可能希望添加更复杂的逻辑,但这是基本思想。

我建议您单独处理它们。如果你让网站在没有AJAX的情况下工作,然后定义一些JSON接口,然后添加一些AJAX使其更好/更快,那么使用AJAX就更容易了。好吧,这是每个框架的想法,让它在没有AJAX的情况下工作,然后使用AJAX。这就是你的意思吗?:)我认为他的意思是将您的Ajax视图完全分开,即有一组视图来接收普通请求,还有一组单独的视图来处理Ajax请求(可能是以api的形式)。作为一名前asp.net mvc开发人员,我有普通视图的操作和仅用于Ajax的操作(返回json内容).我以前读过,但基于类的视图比我想象的更复杂。Django doc很大每次你读到它,你发现了一个新的链接,该链接有30个链接要读:P。问题是文档说仅仅转储是不够的,所以我想看看一些真实世界的例子,看看人们如何使用它,看看他们是否像文档所说的那样扩展json混合。为什么在文档中包括一段非常有用的代码,而不是库中它本身愚蠢的Django…哇,很好很简单请注意,现在是JsonResponse(小写的儿子)