gpt4 book ai didi

django - 我需要在我的 View 中使用 request.is_ajax() 吗?

转载 作者:行者123 更新时间:2023-12-02 09:33:42 24 4
gpt4 key购买 nike

我正在学习在 Django 中使用 Ajax,许多教程只是检查 request.method == 'GET' 或 POST。我很好奇我们需要什么 .is_ajax() 。不使用它是正常现象还是教程只展示基本概念?

最佳答案

I am curious for what do we need .is_ajax() then. Is it normal no to use it or tutorials just show basic concepts?

是的,不使用is_ajax是完全正常的。大多数时候,您在 View 中关心的是 HTTP 动词(例如 GET、POST、PATCH...)。然而,在某些情况下您想知道请求是否是 AJAX 请求。为什么?因为您可能希望根据请求是否是 ajax 返回不同的结果。

此解决方案最常见的用途是 PJAX。当您使用 pjax 技术时,如果请求不是 ajax 请求,您将渲染整个页面,而如果请求来自 ajax,您将仅渲染页面的一部分。然后通过某种lib将部分页面添加到网页中的正确位置,例如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 为前缀的默认模板名称。

关于django - 我需要在我的 View 中使用 request.is_ajax() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com