2017-02-21 119 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 –

相關問題