2017-02-21 122 views
0

我在做一个使用Django和DRF的项目。我有一个列出项目(Conta)细节的视图。所有的字段都是可编辑的,所以用户可以编辑对象。问题是得到错误:'海峡' 对象有没有属性 '数据'DJANGO - 'str'对象没有属性'data'

代码:

class ContaDetailsHTML(APIView): 
    renderer_classes = [TemplateHTMLRenderer] 
    template_name = 'conta_details.html' 

    def get(self, request, pk): 
     user = request.user 
     conta = get_object_or_404(Conta, pk=pk,user=user) 
     serializer = ContaDetailsSerializerHTML(conta) 
     return Response({'serializer': serializer, 'conta': conta}) 

    def post(self, request, pk): 
     user = request.user 
     conta = get_object_or_404(Conta, pk=pk, user=user) 
     serializer = ContaDetailsSerializerPosts(conta, data=request.data) 
     if not serializer.is_valid(): 
      return Response({'serializer': serializer, 'conta': conta}) 
     serializer.save() 
     return Response(status=status.HTTP_200_OK) 

而且在模板:

{% load rest_framework %} 

<html><body> 

<h1>Conta - {{ conta.nome }}</h1> 

<form action="{% url 'conta_details' pk=2 %}" method="POST"> 
    {% csrf_token %} 
    {% render_form serializer %} 
    <input type="submit" value="Save"> 
</form> 

</body></html> 

的PK = 2仅用于测试目的。

当我编辑字段,然后按保存,弹出错误。有任何想法吗?

编辑,网址:

url(r'^api/contas/(?P<pk>[0-9]+)/$', views.ContaDetailsHTML.as_view(), name='conta_details'), 

编辑,错误回溯

Environment: 


Request Method: POST 
Request URL: http://localhost:8000/project/api/contas/2/ 

Django Version: 1.10.5 
Python Version: 3.6.0 
Installed Applications: 
['project.apps.ProjectConfig', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'rest_framework'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 


Template error: 
In template C:\Documentos\Mestrado\ISCN\django\PF\project\templates\conta_details.html, error at line 9 
    'str' object has no attribute 'data' 1 : {% load rest_framework %} 
    2 : 
    3 : <html><body> 
    4 : 
    5 : <h1>Conta - {{ conta.nome }}</h1> 
    6 : 
    7 : <form action="{% url 'conta_details' pk=2 %}" method="POST"> 
    8 :  {% csrf_token %} 
    9 :  {% render_form serializer %} 
    10 :  <input type="submit" value="Save"> 
    11 : </form> 
    12 : 
    13 : </body></html> 

Traceback: 

File "C:\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner 
    39.    response = get_response(request) 

File "C:\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response 
    217.     response = self.process_exception_by_middleware(e, request) 

File "C:\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response 
    215.     response = response.render() 

File "C:\Python36-32\lib\site-packages\django\template\response.py" in render 
    109.    self.content = self.rendered_content 

File "C:\Python36-32\lib\site-packages\rest_framework\response.py" in rendered_content 
    72.   ret = renderer.render(self.data, accepted_media_type, context) 

File "C:\Python36-32\lib\site-packages\rest_framework\renderers.py" in render 
    174.   return template_render(template, context, request=request) 

File "C:\Python36-32\lib\site-packages\rest_framework\compat.py" in template_render 
    306.   return template.render(context, request=request) 

File "C:\Python36-32\lib\site-packages\django\template\backends\django.py" in render 
    66.    return self.template.render(context) 

File "C:\Python36-32\lib\site-packages\django\template\base.py" in render 
    208.      return self._render(context) 

File "C:\Python36-32\lib\site-packages\django\template\base.py" in _render 
    199.   return self.nodelist.render(context) 

File "C:\Python36-32\lib\site-packages\django\template\base.py" in render 
    994.     bit = node.render_annotated(context) 

File "C:\Python36-32\lib\site-packages\django\template\base.py" in render_annotated 
    961.    return self.render(context) 

File "C:\Python36-32\lib\site-packages\django\template\library.py" in render 
    203.   output = self.func(*resolved_args, **resolved_kwargs) 

File "C:\Python36-32\lib\site-packages\rest_framework\templatetags\rest_framework.py" in render_form 
    31.  return renderer.render(serializer.data, None, {'style': style}) 

Exception Type: AttributeError at /project/api/contas/2/ 
Exception Value: 'str' object has no attribute 'data' 
+0

尝试传递到串行前打印'request'并检查他们的任何称为“数据”的东西。 –

+0

请修复缩进(我假设帖子不嵌套在get)请还包括与此视图有关的url – Sayse

+0

您也忘记了从串行器调用此错误'返回响应({'serializer':serializer, 'conta':包含})'。 –

回答

1

的文件似乎是罚款,但该行:

serializer = ContaDetailsSerializerPosts(conta, data=request.data) 

也许,当问题可以是,即

conta = get_object_or_404(Conta, pk=pk, user=user) 
serializer = ContaDetailsSerializerPosts(conta, data=request.data) 

如果您在conta(因为您试图发布/创建一个id = 2的条目,您如何首先查询它)获取404(未找到),以及何时传递给Serializer数据结构/其他的QuerySet的类型,这是错误你可能会得到:

'str' object has no attribute 'data' 

可能的解决方案: 摆脱线的

conta = get_object_or_404(Conta, pk=pk, user=user) 

使serilaizer呼叫作为

serializer = ContaDetailsSerializerPosts(data=request.data) 

如果您使用的是创建(POST)和更新(PUT)相同的看法使其:

if pk: # the update request 
    conta = get_object_or_404(Conta, pk=pk, user=user) 
    serializer = ContaDetailsSerializerPosts(conta, data=request.data) 
else: # the create request 
    serializer = ContaDetailsSerializerPosts(data=request.data) 
+0

我会试一试,谢谢你的时间。 –

+0

这是一个问题,我需要传递对象Conta以便HTML和Serializer知道要编辑的对象 –

+0

我刚刚意识到,更新正在工作。比为什么错误? :O –

相关问题