我正在为招聘任务而苦苦挣扎,我在Django还是个新手,而且我以前还没有使用过REST框架. 我试图建立一个视图,用户可以上传图片,并设置多长时间的链接应该是有效的(在范围3,000-30000,验证工程).此功能通过安装收到文件链接的postman 工作,我有以下错误:

    return renderer.render(serializer.data, None, {'style': style})
AttributeError: 'str' object has no attribute 'data'

当我try 使用网站上传文件时,序列化程序没有通过验证.

我在html文件中使用Render_Form,QueryDict中的结果与postman 中的结果不同,所以我想这就是问题所在,但我不知道如何解决它: 使用网站:

'image_url': ['airplane.jpg'],

使用postman :

 'image_url': [<InMemoryUploadedFile: airplane.jpg (image/jpeg)>]

Models.py:

import datetime

from django.db import models
from django.contrib.auth.models import User
from images.validators import expiring_in_validator


def upload_to(instance, filename):
    unique_identify = str(int(datetime.datetime.now().timestamp()))
    return f"media/{filename}-{unique_identify}"

# Create your models here.
class Image(models.Model):
    uploaded_by = models.ForeignKey(User, on_delete=models.CASCADE)
    image_url = models.ImageField(upload_to=upload_to)
    expiring_within = models.IntegerField(validators=[expiring_in_validator])

Serializers.py:

from rest_framework import serializers
from images.models import Image


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        fields = ['image_url', 'expiring_within']

Views.py:

from django.shortcuts import render
from django.views import View
from rest_framework import status
from rest_framework.parsers import FormParser, MultiPartParser
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.renderers import TemplateHTMLRenderer

from images.serializers import PostSerializer


# Create your views here.
class AddImage(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    # permission_classes = [IsAuthenticated]
    template_name = "add_image.html"
    parser_classes = [MultiPartParser, FormParser]
    def get(self, request):
        serializer = PostSerializer()
        return Response({"serializer": serializer})

    def post(self, request):
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(uploaded_by=self.request.user)
            return Response(serializer.data, status=status.HTTP_200_OK)

Html:

<form method="post">
{% csrf_token %}
        {% render_form serializer %}

    <input type="submit" value="Wyślij">
</form>

推荐答案

对于表单,您需要添加enctype条信息来将文件绑定到表单,如下所示:

<form method="post" enctype="multipart/form-data">
{% csrf_token %}
        {% render_form serializer %}

    <input type="submit" value="Wyślij">
</form>

Django相关问答推荐

Django中有修改字段值的挂钩吗?

在Django管理中仅显示外键的特定值

Django OneToOneFieldto抽象对象

如何在Django CMS中更新上下文

Django Admin:在一个部分中同时显示多个应用程序?

自定义身份验证 django

Django 相当于子查询

Django ORM:子查询上的文本聚合器

带有代码完成功能的 python / django 的 Sublime Text 2 和 3 设置

Django - 站点匹配查询不存在

获取 Django 中的缓存键列表

测试 Django ModelForm 是否有实例

django.request 记录器没有传播到根目录?

在 django 中获取本地时区

使用基于日期/时间的对象进行 Django 单元测试

Django查询在哪里

带有消息判断的 Django/Python assertRaises

清理提交的表单数据中的 HTML

登录后django重定向不起作用next不发布?

它是如何工作的,Django INSTALLED_APPS 的命名约定?