使用基于类的视图和 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 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章