DjangoさんのClass-based generic viewsで使える気がするpjax対応のMixin。link
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していただければよしなにしてくれるはずですよ、大した事してないし。