NameError: name 'JSONResponseMixin' is not defined

NameError: name 'JSONResponseMixin' is not defined

我收到此错误,但我不明白为什么?我正在关注 Django 文档,部分错误代码来自 https://docs.djangoproject.com/en/3.0/topics/class-based-views/mixins/(link 中的最后一个代码)

错误:

/views.py", line 11, in <module>
    class ProgramListView(ListView, JSONResponseMixin, SingleObjectTemplateResponseMixin):
NameError: name 'JSONResponseMixin' is not defined

我在 views.py 中的代码:

from programs.models import Program
from django.views.generic import ListView, DetailView

from django.http import JsonResponse
from django.views.generic.detail import SingleObjectTemplateResponseMixin
from django.views.generic.detail import BaseDetailView




class ProgramListView(ListView, JSONResponseMixin, SingleObjectTemplateResponseMixin):
    
    model = Program
    template_name = 'programs/program_list.html'
    context_object_name = 'programs'
    paginate_by = 6
    paginate_orphans = 3

    def get_queryset(self):

        url_parameter = self.request.GET.get('q')

        # if self.request.method == 'GET' and self.request.is_ajax():
        if self.request.method == 'GET':
            queryset = Program.objects.filter(degree = url_parameter)
            return queryset

        if self.request.method == 'GET' and url_parameter is None:
            queryset = Program.objects.all()
            return queryset


    def render_to_response(self, context, url_parameter='BSc'):
        # Look for a 'format=json' GET argument
        # if self.request.GET.get('format') == 'json':
        # if self.request.is_ajax():
        if url_parameter=='BSc':
            return self.render_to_json_response(context)
        else:
            return super().render_to_response(context)

这是因为您没有导入 JSONResponseMixin。事实上 Django 没有这样的 mixin,这只是一个例子。

如果您真的想添加它,请在您的 class ProgramListView

上方添加此代码
from django.http import JsonResponse

class JSONResponseMixin:
    """
    A mixin that can be used to render a JSON response.
    """
    def render_to_json_response(self, context, **response_kwargs):
        """
        Returns a JSON response, transforming 'context' to make the payload.
        """
        return JsonResponse(
            self.get_data(context),
            **response_kwargs
        )

    def get_data(self, context):
        """
        Returns an object that will be serialized as JSON by json.dumps().
        """
        # Note: This is *EXTREMELY* naive; in reality, you'll need
        # to do much more complex handling to ensure that arbitrary
        # objects -- such as Django model instances or querysets
        # -- can be serialized as JSON.
        return context

来自https://docs.djangoproject.com/en/3.0/topics/class-based-views/mixins/#jsonresponsemixin-example

或者,您可以像这样直接 return 一个 JSON 响应:

if url_parameter=='BSc':
            return JsonResponse(context)