Django-上下文必须是dict而不是ReturnList
我正在从事django项目,我有一个Django-上下文必须是dict而不是ReturnList,django,Django,我正在从事django项目,我有一个Post模型,该模型具有以下视图: class PostListApiView(ListCreateAPIView): queryset = Post.objects.all() serializer_class = PostSerializer filter_backends = [SearchFilter] search_fields = ['user','title','content'] 我使用此视图创建新帖子: @m
Post
模型,该模型具有以下视图:
class PostListApiView(ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
filter_backends = [SearchFilter]
search_fields = ['user','title','content']
我使用此视图创建新帖子:
@method_decorator(login_required, name='dispatch')
class PostCreateView(APIView):
queryset = Post.objects.all()
serializer_class = PostCreateSerializer
renderer_classes = [TemplateHTMLRenderer]
permission_classes = [IsAuthenticated]
template_name = 'post_form.html'
def get(self, request, format=None):
serializer=PostCreateSerializer()
return Response({'serializer':serializer})
def post(self, request):
serializer = PostCreateSerializer(data=request.data)
if not serializer.is_valid():
return Response({'serializer':serializer})
serializer.save()
return redirect('/')
我想把两种观点合并成一种观点
class PostListApiView(ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
filter_backends = [SearchFilter]
search_fields = ['user','title','content']
renderer_classes = [TemplateHTMLRenderer]
template_name = 'post_form.html'
但是,当我尝试将TemplateHTMLRenderer
添加到列表CreateApiView
时,出现以下错误:
Traceback (most recent call last):
File "C:\...\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\...\lib\site-packages\django\core\handlers\base.py", line 145, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\...\lib\site-packages\django\core\handlers\base.py", line 143, in _get_response
response = response.render()
File "C:\...\lib\site-packages\django\template\response.py", line 105, in render
self.content = self.rendered_content
File "C:\...\lib\site-packages\rest_framework\response.py", line 70, in rendered_content
ret = renderer.render(self.data, accepted_media_type, context)
File "C:\...\lib\site-packages\rest_framework\renderers.py", line 167, in render
return template.render(context, request=request)
File "C:\...\lib\site-packages\django\template\backends\django.py", line 59, in render
context = make_context(context, request, autoescape=self.backend.engine.autoescape)
File "C:\...\lib\site-packages\django\template\context.py", line 270, in make_context
raise TypeError('context must be a dict rather than %s.' % context.__class__.__name__)
Exception Type: TypeError at /posts/
Exception Value: context must be a dict rather than ReturnList.
我可以使用
TemplateHTMLRenderer
在模板上呈现查询集和表单吗?如果不能,我该如何实现
谢谢我也遇到了同样的问题,并开始调试DRF以试图解决它。DRF的序列化程序、TemplateHTMLRenderer和Django的templates渲染器之间似乎存在某种问题 在我的例子中,我尝试使用ListCreateAPIView来实现默认的获取和创建行为。我想要json和html响应,所以尝试了以下代码:
class TransactionsController(ListCreateAPIView):
queryset = Transaction.objects.all()
serializer_class = TransactionSerializer
renderer_classes = [TemplateHTMLRenderer]
template_name = 'transactions/index.html'
在尝试访问事务列表时,尽管有以下DRF文档返回,仍然会:
django\template\context.py似乎需要一个dict,但DRF序列化程序返回一个ReturnList(至少在没有从数据库检索到数据的情况下)。这个空的返回列表由TemplateHTMLRenderer处理,TemplateHTMLRenderer反过来调用django呈现器,django呈现器抛出异常
目前我的快速解决方案是:
from rest_framework.generics import ListCreateAPIView
from rest_framework.renderers import TemplateHTMLRenderer
from applications.core.models.transaction import Transaction, TransactionSerializer
class TransactionsTemplateHTMLRender(TemplateHTMLRenderer):
def get_template_context(self, data, renderer_context):
data = super().get_template_context(data, renderer_context)
if not data:
return {}
else:
return data
class TransactionsController(ListCreateAPIView):
queryset = Transaction.objects.all()
serializer_class = TransactionSerializer
renderer_classes = [TransactionsTemplateHTMLRender]
template_name = 'transactions/index.html'
这将检查数据DRF的序列化程序返回的数据,如果该数据为空,则返回dict(而不是默认的返回列表)。这是可行的,但现在我们要看看从数据库检索实际数据时会发生什么
我想在DRF github上报告这一点是个好主意。我也遇到了同样的问题,并开始调试DRF以尝试解决它。DRF的序列化程序、TemplateHTMLRenderer和Django的templates渲染器之间似乎存在某种问题 在我的例子中,我尝试使用ListCreateAPIView来实现默认的获取和创建行为。我想要json和html响应,所以尝试了以下代码:
class TransactionsController(ListCreateAPIView):
queryset = Transaction.objects.all()
serializer_class = TransactionSerializer
renderer_classes = [TemplateHTMLRenderer]
template_name = 'transactions/index.html'
在尝试访问事务列表时,尽管有以下DRF文档返回,仍然会:
django\template\context.py似乎需要一个dict,但DRF序列化程序返回一个ReturnList(至少在没有从数据库检索到数据的情况下)。这个空的返回列表由TemplateHTMLRenderer处理,TemplateHTMLRenderer反过来调用django呈现器,django呈现器抛出异常
目前我的快速解决方案是:
from rest_framework.generics import ListCreateAPIView
from rest_framework.renderers import TemplateHTMLRenderer
from applications.core.models.transaction import Transaction, TransactionSerializer
class TransactionsTemplateHTMLRender(TemplateHTMLRenderer):
def get_template_context(self, data, renderer_context):
data = super().get_template_context(data, renderer_context)
if not data:
return {}
else:
return data
class TransactionsController(ListCreateAPIView):
queryset = Transaction.objects.all()
serializer_class = TransactionSerializer
renderer_classes = [TransactionsTemplateHTMLRender]
template_name = 'transactions/index.html'
这将检查数据DRF的序列化程序返回的数据,如果该数据为空,则返回dict(而不是默认的返回列表)。这是可行的,但现在我们要看看从数据库检索实际数据时会发生什么
我想在DRF github上报告这一点是个好主意。如果你只是想呈现一个模板,为什么要使用DRF???我在我的应用程序中都使用DRF,老实说,我只有一个django视图。数据已经序列化,表单和listcreate视图都可以工作,所以为什么不将两个视图合并到一个模板中呢?如果你只是想呈现一个模板,为什么要使用DRF???我在我的应用程序中都使用DRF,老实说,我只有一个django视图。数据已经序列化,表单和listcreate视图都可以工作,那么为什么不将这两个视图合并到一个模板中呢?