Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Python 混合APIView和FormMixin:&x27;功能';对象没有属性';复印件';_Python_Django_Django Rest Framework - Fatal编程技术网

Python 混合APIView和FormMixin:&x27;功能';对象没有属性';复印件';

Python 混合APIView和FormMixin:&x27;功能';对象没有属性';复印件';,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想创建一个基于类的视图,该视图具有呈现表单的GET方法和处理表单数据并接受JSON的POST方法。因此,我使用Django REST框架的APIView和Django的FormMixin,如下所示: from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.renderers import TemplateHTMLRenderer, JSON

我想创建一个基于类的视图,该视图具有呈现表单的GET方法和处理表单数据并接受JSON的POST方法。因此,我使用Django REST框架的APIView和Django的FormMixin,如下所示:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from django.views.generic.edit import FormMixin
from django.core.urlresolvers import reverse_lazy
from feedback.models import Feedback

class FeedbackView(GenericAPIView, FormMixin):
    renderer_classes = (TemplateHTMLRenderer, JSONRenderer)
    template_name = 'feedback/feedback.html'
    form_class = FeedbackForm
    success_url = reverse_lazy('feedback')

    def get(self, request, *args, **kwargs):
        form = self.get_form()
        return Response({'form': form})
initial = {}
调用
get
方法时,我得到以下错误:

Exception Type: AttributeError at /feedback/
Exception Value: 'function' object has no attribute 'copy'
回溯:

File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)
File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/django/views/generic/base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/rest_framework/views.py" in dispatch
  466.             response = self.handle_exception(exc)
File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/rest_framework/views.py" in dispatch
  463.             response = handler(request, *args, **kwargs)
File "/home/roman/work/gvis_website/feedback/views.py" in get
  62.         form = self.get_form()
File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/django/views/generic/edit.py" in get_form
  74.         return form_class(**self.get_form_kwargs())
File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/django/views/generic/edit.py" in get_form_kwargs
  81.             'initial': self.get_initial(),
File "/home/roman/.virtualenvs/env__gvis_website/lib/python3.3/site-packages/django/views/generic/edit.py" in get_initial
  54.         return self.initial.copy()
initial
是在FormMixin类中定义的空字典,如下所示:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from django.views.generic.edit import FormMixin
from django.core.urlresolvers import reverse_lazy
from feedback.models import Feedback

class FeedbackView(GenericAPIView, FormMixin):
    renderer_classes = (TemplateHTMLRenderer, JSONRenderer)
    template_name = 'feedback/feedback.html'
    form_class = FeedbackForm
    success_url = reverse_lazy('feedback')

    def get(self, request, *args, **kwargs):
        form = self.get_form()
        return Response({'form': form})
initial = {}
为什么它突然失去了它的
copy
方法?或者例外意味着什么? 如果我用一些Django内置类(如
View
)替换
APIView
,则不会出现异常。
我可以使用APIView类和FormMixin吗?或者我应该改变渲染表单的方式吗?

发生这种情况的原因是
GenericAPIView
已经有了一个名为
initial
的方法

首先,您不应该将FormMixin添加到DRF通用视图中,它们不打算一起工作。您应该使用
htmlformrender
作为渲染器。有关更多详细信息,请参阅


另外,考虑使用带前缀的URL拆分json端点,如smth
api/v1/
。在处理更复杂的逻辑时,这将为您节省大量的加班费。

文档说
htmlformrender
不打算直接使用,而是通过
render\u form
模板标记使用。我发现DRF 3.2.3中没有显示此标记,但有未记录的
render_field
标记。不过这没关系,我宁愿使用Django内置工具进行表单渲染。但是您给了我一个关于JSON API的seprate URL的想法。我认为它能以最好的方式解决我目前的问题。我只是想为获取任何内容、帖子数据或JSON数据创建一个url,但现在我发现这是一个麻烦。我用分离的url标记您的答案只是为了得到这个提示。非常感谢。