※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】 DjangoでAjaxを使うと、どうも普通のフレームワークチックになってしまう。どうもDRYじゃない。
Djangoに組み込まれているシリアライザも、QuerySetを受けとるものとDictを受けとるものの2種類あるのも面倒。
Dictを受けとるものを使うのが悪いんだけど…。
なにか解決策が無いかと考えても、 Ajaxの戻りはなかなか一般化できない し、定型にしたとしても 名前を付けてほげらないと何とも出来ない から、挫折してデコレータだけ書いてみた。
from django.http import HttpResponse
from django.db.models.query import QuerySet
def generic_json(func, ensure_ascii=True, charset='utf-8'):
def _generic_json(*args, **kw):
res = func(*args, **kw)
if isinstance(res, QuerySet):
from django.core import serializers
result = serializers.serialize('json', res, ensure_ascii=ensure_ascii)
elif isinstance(res, dict):
from django.utils import simplejson
result = simplejson.dumps(res, ensure_ascii=ensure_ascii)
else :
raise NotImplementedError
return HttpResponse(result, mimetype='text/javascript; charset=%s' % charset)
return _generic_json
ビューにdictかQuerySetを返させて、view_func = generic_json(view_func, ensure_ascii=False) とすればjsonを返す。ただそれだけ。むぅ、なんとかならないものか。