DjangoさんのClass-based generic viewsで使える気がするpjax対応のMixin。

 Class-based generic views | Django documentation | Django
 defunkt/jquery-pjax

 以前、Djangoさんのview関数(と言っておけばいいのかな)で使える気がするpjaxによるアクセスかどうかを班別するdecoratorみたいなのを書いたのですが(例のあれ(仮題)- pjaxによるアクセスかどうかを判別するdocorator、Djangoさんの話です。)、その流れで、今度はClass-based viewで使える気がするMixinを書いてみました。

 と言っても、例によって書いたのは随分と前の話でありまして、この夏の終わりにまだまだ寒かった頃の事を思い出しながらのネタ出し、かつその後ほったらかしなのでもっと上手い方法があるんじゃないか疑惑満載でございます。

from django.views.generic.base import TemplateResponseMixin

class PjaxTemplateResponseMixin(TemplateResponseMixin):

    def get_template_names(self):
        templates = TemplateResponseMixin.get_template_names(self)
        if self.is_pjax:
            templates[0] = '_pjax.'.join(templates[0].rsplit('.', 1))
        return templates

    @property
    def is_pjax(self):
        return 'HTTP_X_PJAX' in self.request.META

    @property
    def pjax_container(self):
        if self.is_pjax:
            return self.request.META['HTTP_X_PJAX_CONTAINER']
        return None

 仕組みとしては前回同様pjaxアクセスだったらテンプレート名を_pjax付きに変換して返すので、その_pjax付きのテンプレートは事前に用意しておくというもの。おまけでpjaxアクセスか判別するのと、jQuery-pjax側が一応ヘッダーに含めて送ってくれるPjax用コンテナ名のプロパティも付けておきました。

 get_template_names()が返すのは配列なので複数のテンプレート名を含まなければいけないケースも出てくるのかと思うのだけど、今のところ必要となっていないし、そもそも私がどうして配列なのかすらわかってないので普通に一つだけ返しています。まぁ、適当に適当で。

 あとはお使いのClass-based generic viewとかでMixinしていただければよしなにしてくれるはずですよ、大した事してないし。