from django.http import HttpResponse import simplejson class AJAXFallbackView(View): # views (get, post, etc) must return (context, template) instead of rendering it themselves # similar to auto_render valid_json_start = ['"', '[', '{'] valid_json_end = ['"', ']', '}'] def dispatch(self, request, *args, **kwargs): if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed self.request = request self.args = args self.kwargs = kwargs template, ctx = handler(request, *args, **kwargs) return self.render(template, ctx) def render(self, template, context): if self.format=='json': json = simplejson.dumps(context) callback = self.request.GET.get('callback') if callback: if json[0] not in self.valid_json_start or json[-1] not in self.valid_json_end: json = ''.join(['"',json,'"']) return HTTPResponse('%s(%s)' % (callback,json),mimetype='application/javascript') return HTTPResponse(json, mimetype='application/json') else: return render_to_response(template, context, RequestContext(self.request)) ############################## #sample view class MyListView(AJAXFallbackView): def get(self, request): return 'index.html',{'models':MyModel.objects.all()}