Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-上下文必须是dict而不是ReturnList_Django - Fatal编程技术网

Django-上下文必须是dict而不是ReturnList

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

我正在从事django项目,我有一个
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视图都可以工作,那么为什么不将这两个视图合并到一个模板中呢?