我正在学习使用Ajax和Django,许多教程只是检查request.method == 'GET'
或POST。我很想知道我们需要什么.is_ajax()
。是否正常不使用它或教程只显示基本概念?
答案 0 :(得分:5)
我很想知道我们需要什么.is_ajax()然后。这是不正常的 使用它或教程只显示基本概念?
是的,不使用is_ajax
是完全正常的。大多数时候,您在视图中关心的是HTTP动词(例如GET,POST,PATCH ..)。
但是,在某些情况下,您想知道请求是否是AJAX请求。为什么?因为您可能希望返回不同的结果,具体取决于请求是否为ajax。
此解决方案最常见的用途是PJAX。当您使用pjax技术时,如果请求不是ajax请求,则渲染整个页面,而如果请求来自ajax,则只渲染页面的一部分。然后通过某种类型的库(例如https://github.com/defunkt/jquery-pjax)将部分页面添加到网页中的正确位置。
例如,这是我在django中使用Pjax编写的混音:
import os
from django.views.generic.base import TemplateResponseMixin
class PJAXResponseMixin(TemplateResponseMixin):
pjax_template_name = None
pjax_suffix = "pjax"
pjax_url = True
def get_context_data(self, **kwargs):
context = super(TemplateResponseMixin, self).get_context_data(**kwargs)
context['inner_template'] = self.pjax_template_name
return context
def get_template_names(self):
names = super(PJAXResponseMixin, self).get_template_names()
if self.request.is_ajax():
if self.pjax_template_name:
names = [self.pjax_template_name]
else:
names = self._pjaxify_template_var(names)
return names
def get(self, request, *args, **kwargs):
response = super(PJAXResponseMixin, self).get(request, *args, **kwargs)
if sel
f.pjax_url :
response['X-PJAX-URL'] = self.request.path
return response
def _pjaxify_template_var(self, template_var):
if isinstance(template_var, (list, tuple)):
template_var = type(template_var)(self._pjaxify_template_name(name) for name in template_var)
elif isinstance(template_var, basestring):
template_var = self._pjaxify_template_name(template_var)
return template_var
def _pjaxify_template_name(self, name):
container = self.request.META.get('HTTP_X_PJAX_CONTAINER', False)
if container is not False:
name = _add_suffix(name, clean_container_name(container))
return _add_suffix(name, self.pjax_suffix)
#################################################
# HELPER METHODS #
#################################################
def clean_container_name(name):
return name.replace('#', '')
def _add_suffix(name, suffix):
if "." in name:
file_name, file_extension = os.path.splitext(name)
name = "{0}-{1}{2}".format(file_name, suffix, file_extension)
else:
name += "-{0}".fomat(suffix)
return name
基本上,如果请求不是ajax请求,则此混合会呈现默认模板。而如果请求是AJAX,则会呈现pjax_template
(如果有),或者前缀为pjax
的默认模板的名称。