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)
我收到此错误,但我不明白为什么?我正在关注 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)