Django でお手軽に Pjax


Django アプリで Pjax 導入した。必要なものは全て Github にあった。

Pjax については pjax こそが pushState + Ajax の本命 - punitan (a.k.a. punytan) のメモ こちらのエントリなどが詳しい。



ライブラリ

GitHub - defunkt/jquery-pjax: pushState + ajax = pjax
GitHub - jacobian/django-pjax: MOVED - see https://github.com/eventials/django-pjax


clone して適宜配置。

django-pjax は djpjax という名前にした(ハイフン入ると import error になる為)
※ clone した後、__init__.py 置かないと import時にモジュール発見されなくてハマった(Python慣れてない)



コントローラーのサンプル

views.py

from submodule.djpjax.djpjax import pjax
from django.template.response import TemplateResponse

@pjax()
def pjax_get(request):
    ctxt = RequestContext(request, {
        "val1": "Pjax で取ってきたよ",
    })

    return TemplateResponse(request, 'pjax/get.html', ctxt)

django-pjax は Django1.3 から導入されたテンプレートクラスである TemplateResponse をベースに利用しているようです。

リクエストメソッドに @pjax() デコレータを書くだけで、ヘッダ内に X_PJAX があるかをチェックし、レスポンス用のテンプレートを選択して返してくれます。



呼び出し側テンプレートのサンプル

pjax/index.html

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="/path/to/jquery.pjax.js" type="text/javascript"></script>
<div>
    Pjaxテストページだよ
</div>

{#  jQuery.pjax を使って aタグの動作を変更している #}
<script>
  $(document).ready(function() {
    $("a.js-pjax").pjax("#main");
  });
</script>

{# data-pjaxアトリビュートでレスポンスを反映させるidを指定する #}
<div style="margin:10px 0;">
    <a href="/index/pjax_get/" data-pjax="main" class='js-pjax'>Pjaxで遷移する</a><br>
</div>

{# data-pjaxアトリビュートで指定したidが付与されたタグにレスポンスが反映される #}
<div id="main">
    {% if val1 %}
        {{ val1 }}
    {% else %}
        このテキストが変更されます
    {% endif %}
</div>

呼ばれるテンプレート

通常のリクエストで返されるテンプレートが get.html の場合、Pjaxリクエスト時に返されるテンプレートはサフィックスに -pjax を付けておけばよきにはからってくれるので、get-pjax.html という名前で用意しておく。




これだけでお手軽に Pjax対応できるので、どんどんやると良いと思います!