首页 > 解决方案 > Django“str”对象没有属性“数据”

问题描述

当我尝试在 django 的数据库中保存帖子时出现此错误。

我做错了什么,我该如何解决?

/account/create-post 处的 AttributeError

“str”对象没有属性“data”

我有这个领域

图片

我的模型:

class Post(models.Model):
    created_date = models.DateTimeField()
    title = models.CharField(max_length=100)
    profile_image = models.ImageField(upload_to='poze', blank=True, null=True)
    text = models.CharField(max_length=1000, default='Nimic', blank=True)
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)

看法:

class CreatePost(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'create_post.html'

    def get(self,request):
        serializer=CreatePostSerializer()
        return Response({'fields':serializer})

    def post(self, request):
        serializer = CreatePostSerializer(data=request.data)
        if not serializer.is_valid():
            return Response({'serializer': serializer.data})

        user = UserProfile.objects.filter(username=request.user.username).first()
        serializer.save(user=user)
        return redirect('mainPage')

创建_post.html:

    {% extends 'base.html' %}
{% load rest_framework %}

{% block content %}
<div class="offset-3 col-md-6">
<form action="{% url 'create_post' %}" method="POST">
    <div class="form-group">

    {% csrf_token %}
    {% render_form fields %}

</div>
   <button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
{% endblock %}

网址:

 url(r'create-post$', login_required(CreatePost.as_view()), name='create_post'),

控制台中有什么:

  Internal Server Error: /account/create-post Traceback (most recent call last):   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 158, in _get_response
    response = self.process_exception_by_middleware(e, request)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 156, in _get_response
    response = response.render()   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\response.py", line 106, in render
    self.content = self.rendered_content   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\response.py", line 72, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\renderers.py", line 176, in render
    return template.render(context, request=request)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 175, in render
    return self._render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\loader_tags.py", line 155, in render
    return compiled_parent._render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 167, in _render
    return self.nodelist.render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\loader_tags.py", line 67, in render
    result = block.nodelist.render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 943, in render
    bit = node.render_annotated(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\base.py", line 910, in render_annotated
    return self.render(context)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)   File "C:\Users\Intern\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\templatetags\rest_framework.py", line 84, in render_form
    return renderer.render(serializer.data, None, {'style': style}) AttributeError: 'str' object has no attribute 'data' [10/Aug/2018 17:51:09] "POST /account/create-post HTTP/1.1" 500 147258

标签: pythondjangodjango-rest-framework

解决方案


问题似乎出在以下函数中View

def post(self, request):
    serializer = CreatePostSerializer(data=request.data) <---- ERROR
    if not serializer.is_valid():
        return Response({'serializer': serializer.data})

request参数的类型是,str而不是对象,因此AttributeError当尝试访问dataa 的不存在属性时str。我对 Django 并不完全熟悉,但根据我对 HTTP 请求和客户端-服务器“东西”的一些了解,我假设request它作为字符串传递,需要被解析并转换为对象。


推荐阅读