我正在學習使用Django與Django,很多教程只是檢查是否request.method == 'GET'
或POST。我很好奇,那麼我們需要什麼.is_ajax()
。使用它還是正常的,或者教程只是展示基本概念?我需要在我的視圖中使用request.is_ajax()嗎?
2
A
回答
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
。
相關問題
- 1. MVC - 我需要在視圖中使用控制器嗎?
- 2. 我需要初始化新視圖嗎?
- 3. 我需要在DynamoDB中使用EC2嗎?
- 4. 我需要在Scala中使用@tailrec嗎?
- 5. 我需要在Codeigniter中使用HTMLpurifier嗎?
- 6. 我需要使用NSKeyedArchiver嗎?
- 7. 我需要使用NSLock嗎?
- 8. 我需要在移動視圖中使我的字體響應
- 9. 如果我要在Perl中使用純OO,我需要Exporter嗎?
- 10. 我需要在我的視圖中調用MediaPlayer
- 11. 在屏幕上繪圖,我需要表面視圖嗎?
- 12. 我需要Silverlight中MVVM-light的視圖控制器嗎?
- 13. 我需要在OCaml中調用Random.self_init嗎?
- 14. 我真的需要使用ContentProvider嗎?
- 15. 我需要使用Azure的iptables嗎?
- 16. 在Python中,在使用read()之後,我需要使用close()嗎?
- 17. 我需要調用CloseHandle嗎?
- 18. 我需要鎖嗎?
- 19. 我需要BackgroundWorker嗎?
- 20. 我需要app.config嗎?
- 21. 我需要getJson嗎?
- 22. 我需要phpMyAdmin嗎?
- 23. 我需要鎖嗎?
- 24. 我需要TestFlight嗎?
- 25. 我需要PolylineOptions嗎?
- 26. 我應該使用視圖渲染複雜的json數據,我需要視圖助手嗎?
- 27. 我應該在我的MVC視圖中使用Url.Content()或ResolveUrl()嗎?
- 28. 我需要在PHP中使用session_start()來使用$ _SESSION嗎?
- 29. 如果使用JWT,我需要CSRF嗎?
- 30. 我需要再次使用std :: move嗎?
您需要使用它,如果它需要特別針對Ajax請求的不同行爲。爲什麼這會讓人困惑? –