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

Posted

技术标签:

【中文标题】使用基于类的视图和 ajax 的 Django 应用程序?【英文标题】:Django apps using class-based views and ajax? 【发布时间】:2011-12-24 22:35:24 【问题描述】:

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

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

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

谢谢你:)

【问题讨论】:

我建议您单独处理它们。如果您让网站在没有它的情况下运行,然后定义一些 JSON 接口,然后添加一些 AJAX 以使其更好/更快,那么使用 AJAX 会更容易。 嗯,这就是每个框架中的想法,让它在没有 ajax 的情况下工作,然后,ajax 它。你是这个意思吗? :) 我认为他的意思是将你的 Ajax 视图完全分开,即有一组视图来接收普通请求和一组单独的视图来处理 ajax 请求(可能是 api 的形式)跨度> 好吧,作为一名前 asp.net mvc 开发人员,我有普通视图的操作和仅 ajax 的操作(返回 json 内容)。 【参考方案1】:

如果你想同时支持 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。如果它返回“成功”,您可能想要添加更复杂的逻辑,但这是基本思想。

【讨论】:

哇,好简单 请注意,现在是 JsonResponse(小写 SON)【参考方案2】:

不使用流行的 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

假设有一个名为 ajax_required 的模板来处理这个特定的故障。如果那是您不想要的,这样的事情会阻止用户在浏览器中输入您的 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 sn-p 的所有 ajax,您可以定义基于短类的视图,例如:

class ShowSomeTable(AjaxGeneral):
    template_name="some_table.html"

假设 some_table.html 里面有一些 html sn-p。

现在这个视图的 urls.py 条目将如下所示:

url(r'showtable/$', ShowSomeTable.as_view()),

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

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

我以前读过,但是基于类的视图比我想象的要复杂。 Django 文档很大,每次阅读时,都会发现一个新链接,并且该链接有 30 个链接可供阅读:P。问题是文档说只有转储是不够的,所以我想看看一些真实世界的例子,看看人们如何使用它,看看他们是否像文档说的那样扩展了 json 混合。 为什么在文档中包含非常有用的 sn-p 代码而不是库本身?愚蠢的姜戈……

以上是关于使用基于类的视图和 ajax 的 Django 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Django:基于类的 ListView 中的搜索表单

基于 Django 类的通用视图和 ModelForms

Django 基于类的通用视图和身份验证

用于创建和更新的基于 Django 类的视图

Django中基于函数的视图和基于类的视图以及路由传参

如何在 django 中使用基于类的视图