2013-08-13 3 views
0

Я пытаюсь использовать «JSONResponseMixin» из пакета Django-braces.Django Braces «JSONResponseMixin» показывает странное поведение

Mixin:

class JSONResponseMixin(object): 
    """ 
    A mixin that allows you to easily serialize simple data such as a dict or 
    Django models. 
    """ 
    content_type = u"application/json" 
    json_dumps_kwargs = None 

    def get_content_type(self): 
     if self.content_type is None: 
      raise ImproperlyConfigured(
       u"%(cls)s is missing a content type. " 
       u"Define %(cls)s.content_type, or override " 
       u"%(cls)s.get_content_type()." % { 
       u"cls": self.__class__.__name__} 
      ) 
     return self.content_type 

    def get_json_dumps_kwargs(self): 
     if self.json_dumps_kwargs is None: 
      self.json_dumps_kwargs = {} 
     self.json_dumps_kwargs.setdefault(u'ensure_ascii', False) 
     return self.json_dumps_kwargs 

    def render_json_response(self, context_dict, status=200): 
     """ 
     Limited serialization for shipping plain data. Do not use for models 
     or other complex or custom objects. 
     """ 
     json_context = json.dumps(context_dict, cls=DjangoJSONEncoder, 
            **self.get_json_dumps_kwargs()) 
     return HttpResponse(json_context, 
          content_type=self.get_content_type(), 
          status=status) 

    def render_json_object_response(self, objects, **kwargs): 
     """ 
     Serializes objects using Django's builtin JSON serializer. Additional 
     kwargs can be used the same way for django.core.serializers.serialize. 
     """ 
     json_data = serializers.serialize(u"json", objects, **kwargs) 
     return HttpResponse(json_data, content_type=self.get_content_type()) 

я в основном наследуя это подмешать в моей собственной точки зрения, чтобы вернуть ответ JSON в Javascript функцию обратного вызова.

Вот мое мнение:

views.py

class PostDetail(JSONResponseMixin, DetailView): 
    model = Post 
    template_name = 'post_detail_page.html' 

Так что это на самом деле очень простой вид ... но когда я открываю эту точку зрения, странная вещь происходит. На странице показан простой html-исходный код вместо рендеринга источника на html-страницу. Конечно, этого не происходит, как только я удаляю наследование JSONResponseMixin на мой взгляд. Я понятия не имею, почему это происходит, поскольку JSONResponseMixin не переопределяет метод «render_to_response» или что-то важное ...

Может кто-нибудь сказать мне, почему это происходит ..? Благодаря!!!

Btw, это результирующий HTML-страница:

<html> 
    <head> 
     <link title="Wrap Long Lines" href="resource://gre-resources/plaintext.css" type="text/css" rel="alternate stylesheet"> 
     #HAVE NO IDEA WHERE THIS CAME FROM... 
    </head> 

    <body> 
     #ALL MY HTML SOURCE CODE APPEARS HERE WITHOUT BEING RENDERED!!! 
    </body> 
</html> 
+0

тип содержимого для ответа является «применение/JSON» по умолчанию. Это не превратит ваш шаблон в HTML. –

ответ

1
content_type = u"application/json" 

Эта строка фактически используется DetailView. Мое лучшее предположение, что это испортило рендеринг вашего шаблона; либо используя "application/json", либо не поставляя кодировку.

Я бы оставил только по умолчанию content_type (используйте content_type = None) и переопределит get_content_type, чтобы указать тип содержимого, который вам нужен при использовании Ajax.

Чтобы полностью включить JSON в ваш взгляд, вы, вероятно, следует переписать render_to_response на вашем PostDetail зрения:

class PostDetail(JSONResponseMixin, DetailView): 
    model = Post 
    template_name = 'post_detail_page.html' 
    content_type = None 

    def render_to_response(self, **kwargs): 
     if self.request.is_ajax(): 
      # Don't really know if objects will take a list, a queryset, any iterable or even a single object 
      return self.render_json_object_response(objects=[self.object]): 
     else: 
      return super(PostDetail, self).render_to_response(**kwargs) 

    def get_content_type(self): 
     if self.request.is_ajax(): 
      return u'application/json' 
     else: 
      return None 
+0

На самом деле вы были правы !!! Как только я помещаю «content_type = None», проблема исчезла :)) Тем не менее, я не совсем уверен, как я должен соответствующим образом переопределить метод get_content_type ... – user2492270

+0

Я предполагаю, что это будет что-то вроде ... », если я сам .request.is_ajax(): вернуть u'application/json '"в get_content_type ?? – user2492270

+0

На самом деле, учитывая, что вы используете 'get_content_type' только для запроса Ajax, вы можете просто выполнить' def get_content_type (self): return u'application/json''. – knbk

Смежные вопросы