Как отправить HTTP-ответ в формате Json в Generic Class Views [Django] - PullRequest
0 голосов
/ 24 мая 2018

У меня есть субклассовый класс Generic DetialView в views.py, и я пытаюсь найти способ вернуть данные в формате JSON на основе аргумента, полученного в URL.Вот что я пытался сделать ...

# views.py
from django.views.generic import DetailView
from django.http import JsonResponse    

class ExtendedView(DetailView):
    context_object_name = 'post'
    model = StorageModel
    template_name='posts.html'

    def get_context_data(self, **kwargs):
        data = super(HacksViewPost, self).get_context_data(**kwargs)
        if bool(self.request.GET):
            data__ = JsonForm(request.GET)
            if data__.is_valid():
                json = data__.cleaned_data['json']
                if json == 'true':
                    return JsonResponse({'data': 'data'})
        return data

Но это дало мне TypeError в порядке:

TypeError at /category/extended-slug/
context must be a dict rather than JsonResponse.

URL-адрес, который активирует класс ExtendedView:

/category/extended-slug?json=true

Итак, вопрос в том, как я могу отправить данные в формате JSON из класса общего представления, и есть ли более эффективные способы добиться этого?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я думаю, что вы исправили это на неправильном уровне.get_context_data используется функцией get для ее рендеринга.В результате объект get_context_data имеет нет элемента управления для того, что делается с результатом, для построения ответа сервера,

Однако вы можете установить функцию get(..) как:

class ExtendedView(DetailView):

    """A base view for displaying a single object."""
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        <b>data =</b> self.get_context_data(object=self.object)
        if self.request.GET:
            data__ = JsonForm(request.GET)
            if data__.is_valid():
                json = data__.cleaned_data['json']
                if json == 'true':
                    <b>return JsonResponse({'data': data})</b>
        <b>return self.render_to_response(data)</b>

То же самое относится к post, put и другим запросам.

Если мы посмотрим на исходный код DetailView мы видим:

class BaseDetailView(SingleObjectMixin, View):
    """A base view for displaying a single object."""
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

Следовательно, get(..) вызывает функцию get_context_data(..).Но он не немедленно возвращает результат, он упаковывает его в обработанный ответ.

0 голосов
/ 24 мая 2018

Вы не можете вернуть JsonResponse в методе get_context_data.Метод get_context_data позволяет отправлять дополнительную информацию (контекст) в шаблон и, как ожидается, вернет dict, а не JsonResponse.

Если вы хотите вернуть JsonResponse, выполнитечто в get или post методе вашего класса.

...