我需要在我的视图中使用request.is_ajax()吗?

时间:2015-06-06 21:12:41

标签: django

我正在学习使用Ajax和Django,许多教程只是检查request.method == 'GET'或POST。我很想知道我们需要什么.is_ajax()。是否正常不使用它或教程只显示基本概念?

1 个答案:

答案 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的默认模板的名称。