2015-06-06 17 views
2

我正在學習使用Django與Django,很多教程只是檢查是否request.method == 'GET'或POST。我很好奇,那麼我們需要什麼.is_ajax()。使用它還是正常的,或者教程只是展示基本概念?我需要在我的視圖中使用request.is_ajax()嗎?

+0

您需要使用它,如果它需要特別針對Ajax請求的不同行爲。爲什麼這會讓人困惑? –

回答

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