Djangoでpjaxするdjango-pjaxを試してみた
djangoでpjaxをするのにdjango-pjaxというライブラリがあるので試してみました。
django-pjax
https://github.com/jacobian/django-pjax
とりあえず動かしてみるまでの実装
適当にdjangoのプロジェクトを作ります。
views.py
from django.template.response import TemplateResponse from djpjax import pjax @pjax() def index(request): return TemplateResponse(request, 'app/index.html', {}) @pjax() def about(request): return TemplateResponse(request, 'app/about.html', {}) @pjax() def contact(request): return TemplateResponse(request, 'app/contact.html', {})
views関数はpjaxデコレータとTemplateResponseを使うってところがポイントです。
pjaxデコレータは、requestヘッダーににHTTP_X_PJAXがセットされていた場合、TemplateResponseにセットされているテンプレート名称を"-pjax"をつけたものに変更します。
なので、上記のviews.pyだとテンプレートは6つ用意する必要があります。
app/index.html app/index-pjax.html app/about.html app/about-pjax.html app/contact.html app/contact-pjax.html
あとはテンプレートのリンクとjsですが、こんな感じになります
<ul> <li><a href="/" data-pjax='#main'>Home</a></li> <li><a href="/about" data-pjax='#main'>About</a></li> <li><a href="/contact" data-pjax='#main'>Contact</a></li> </ul> <div id="main"> </div> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script src="/static/extras/jquery-pjax/jquery.pjax.js"></script> <script type="text/javascript"> $(function(){ $('a[data-pjax]').pjax(); }); </script>
これだけで、pjaxができるようになります。
サンプルはこちらにアップしました
http://djangopjax.herokuapp.com/
https://github.com/yuhei0718/django-pjax-sample
注意点としてハマったところをひとつ。
動作確認中に*-pjax.htmlの中身を、適当に「about」とかだけ書いて動かそうとしてたんですが、これだと正常に動かないです。
具体的にはpjaxのレスポンスの処理がエラーになり、通常のリクエストが投げられて、そちらが描画されることになります。
ちゃんとhtmlタグを書けばpjaxで動きました。
<!-- about --> <h2>about</h2>