Общий вид для рендеринга JSON и HTML

В ListAPIView я пытаюсь перегрузить класс для рендеринга HTML и JSON, как показано ниже. Для рендеринга JSON ожидается предоставление serializer.data для Response для рендеринга вывода JSON. Для рендеринга HTML ожидается предоставление context_data в типе dict и имени шаблона для Response для рендеринга HTML.

Чтобы повторно использовать существующий код rest framework, я пытаюсь извлечь уже сериализованные данные rest framework и за один раз перегрузить данные ответа сериализованными данными и именем шаблона. В результате шаблон HTML не отображается должным образом из-за того, что предоставленные данные не относятся к типу dict.

class UserProfileList(generics.ListAPIView):
    model = UserProfile
    serializer_class = UserProfileSerializer
    template_name = 'userProfile/list.html'
    queryset =  UserProfile.objects.all()

    def list(self, request, *args, **kwargs):
        response = super(generics.ListAPIView, self).list(request, *args, **kwargs)
        return Response(response.data, template_name=self.template_name)

Интересно, есть ли расширение Response для создания объекта с сериализатором, данными в типе dict, шаблоном в качестве параметров, чтобы мы могли повторно использовать библиотеку без явной идентификации формата запроса. Любые намеки или предложения.

class UserProfileList(generics.ListAPIView):
    model = UserProfile
    serializer_class = UserProfileSerializer
    template_name = 'userProfile/list.html'
    queryset =  UserProfile.objects.all()

    def list(self, request, *args, **kwargs):
        return Response(self.get_serilaizer(), self.get_context_data(), template_name=self.template_name)

person Tommy Tang    schedule 26.06.2013    source источник
comment
Вы как-то решили?   -  person Daviddd    schedule 08.08.2013


Ответы (1)


В своей первой версии вы пробовали распечатать response.data? Несомненно, это не диктат, а какое-то сериализованное представление. Может быть, строка JSON. Вам нужно будет десериализовать его, если вы хотите вернуть его в качестве контекста шаблона.

Вам может понадобиться что-то подобное на основе кода в ListModelMixin:

self.object_list = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(self.object_list, many=True)
return Response(serializer.data, template_name=self.template_name)
person paulmelnikow    schedule 20.01.2014