我正在学习 Django,我发现了基于类的视图,我想知道如何在这些视图上实现 Ajax。
我在 github 上搜索了一个 django 项目,发现一些使用基于类的视图,但没有使用 ajax。
所以......有人知道一个使用这两种东西的开源项目吗?这样学起来更容易。
谢谢 :)
我正在学习 Django,我发现了基于类的视图,我想知道如何在这些视图上实现 Ajax。
我在 github 上搜索了一个 django 项目,发现一些使用基于类的视图,但没有使用 ajax。
所以......有人知道一个使用这两种东西的开源项目吗?这样学起来更容易。
谢谢 :)
不使用流行的 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 片段的所有 ajax,您可以定义基于短类的视图,例如:
class ShowSomeTable(AjaxGeneral):
template_name="some_table.html"
假设 some_table.html 中有一些 html 片段。
现在,此视图的 urls.py 条目将如下所示:
url(r'showtable/$', ShowSomeTable.as_view()),
你可以像往常一样在js中调用它:
$(#dynamic-content).load('/showtable');
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 请求和正常请求的视图。
如果您想同时支持 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。在它返回“成功”的地方,您可能想要添加更复杂的逻辑,但这是基本思想。