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

Jes*_*uez 18 django ajax django-class-based-views

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

我搜索了github的django项目,我发现一些使用基于类的视图但不是ajax.

那么......有谁知道一个开源项目同时使用这两个东西?这种方式更容易学习.

谢谢 :)

小智 13

没有使用流行的dajaxic和dajax包,它仍然是一个直截了当的事情.

编写一个装饰器,它只是为了请求对象包装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
Run Code Online (Sandbox Code Playgroud)

假设有一个名为ajax_required的模板来处理这个特定的失败.这样的事情可以防止用户在浏览器中输入你的ajax特定网址,如果这是你不想要的.

因为它是一个较短的例子,以下是一个基于类的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)
Run Code Online (Sandbox Code Playgroud)

现在对于所有需要渲染html片段的ajax,你可以定义基于短类的视图,如:

class ShowSomeTable(AjaxGeneral):
    template_name="some_table.html"
Run Code Online (Sandbox Code Playgroud)

假设some_table.html中有一些html片段.

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

url(r'showtable/$', ShowSomeTable.as_view()),
Run Code Online (Sandbox Code Playgroud)

你可以像往常一样在js中调用它:

$(#dynamic-content).load('/showtable');
Run Code Online (Sandbox Code Playgroud)


Tim*_*ony 10

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

该文档有一个mixin的例子,可以用来返回JSON,所以这是一个很好的起点:

https://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/#more-than-just-html

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

  • 我以前读过这个,但是基于类的视图比我想象的要复杂得多.Django doc很大,每次你阅读它,你发现一个新的链接,该链接有30个链接阅读:P.问题是该文档说只是一个转储是不够的所以我想看到一些现实世界的例子,看看人们如何使用它,看看他们是否扩展了json混合,就像文档说的那样. (14认同)

Apo*_*ata 5

如果你想同时支持 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)
Run Code Online (Sandbox Code Playgroud)

这通常处理常规视图(使用重定向等),但对于 AJAX,它返回一个 JSONResponse。在它返回“成功”的地方,您可能想要添加更复杂的逻辑,但这是基本思想。