Объект django "str" ​​не имеет атрибута "данные"

У меня возникает эта ошибка, когда я пытаюсь сохранить сообщение в своей базе данных в django.

Что я делаю не так и как это исправить?

AttributeError at /account/create-post

'str' object has no attribute 'data'

У меня есть это поле

image

Моя модель:

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')

Create_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:

 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
1
0
567
3

Ответы 3

Проблема, похоже, заключается в функции View:

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

Аргумент request имеет тип str, а не объект, следовательно, AttributeError при попытке доступа к несуществующему атрибуту datastr. Я не совсем знаком с Django, но, обладая некоторыми знаниями о HTTP-запросах и "материалах" клиент-сервер, я предполагаю, что request передается в виде строки и должен быть проанализирован и преобразован в объект.

Фреймворк Django rest ищет тег шаблона render_form для рендеринга сериализатора.

Serializers may be rendered as forms by using the render_form template tag, and including the serializer instance as context to the template.

https://www.django-rest-framework.org/topics/html-and-forms/

Так как вы назвали его fields. В посте это должно было быть

return Response({'fields':serializer})

Так,

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

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

    def post(self, request):
        serializer = serializers.CreatePOSTS(data=request.data)
        if not serializer.is_valid():
            return Response({'fields':serializer}) #forms + serializer errors. :)
        user = customers.objects.filter(username=request.user.username).first()
        serializer.save(user=user)
        return redirect('mainPage')

Надеюсь это поможет :)

Попробуйте это в своем views.py:

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

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

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

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

в вашем create_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 serializer %}

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

Надеюсь, поможет.

Другие вопросы по теме