You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework图片上传报错:'str'无'data'属性及表单上传失败

Django REST Framework图片上传问题排查与解决

问题概述

作为Django新手,首次使用REST Framework开发图片上传功能,需求是用户上传图片并设置3000-30000范围内的链接有效期(该验证已生效),但遇到以下问题:

  • Postman调用报错:返回AttributeError: 'str' object has no attribute 'data',无法获取文件链接
  • 网页表单上传失败:
    • 网页提交的image_url仅为字符串文件名['airplane.jpg'],而Postman提交的是InMemoryUploadedFile对象
    • 表单提交后序列化器无法通过验证,最终触发500错误,回溯信息指向render_form时str对象无data属性

问题根源与修复步骤

1. 修复网页表单文件上传属性

网页表单未设置enctype="multipart/form-data",导致文件无法正确上传,仅传递文件名而非文件对象。

修改HTML表单代码:

<form method="post" enctype="multipart/form-data">
{% csrf_token %}
    {% render_form serializer %}
    <input type="submit" value="Wyślij">
</form>

2. 统一APIView POST请求返回格式

视图使用TemplateHTMLRenderer作为渲染器,但POST成功时直接返回serializer.data(JSON结构),导致模板渲染时找不到serializer对象,触发错误。

修改views.py的POST方法:

def post(self, request):
    serializer = PostSerializer(data=request.data)
    if serializer.is_valid():
        image = serializer.save(uploaded_by=self.request.user)
        # 返回包含序列化器和图片链接的模板上下文
        return Response({
            "serializer": serializer,
            "image_link": image.image_url.url  # 生成可访问的图片链接
        }, status=status.HTTP_200_OK)
    # 验证失败时返回带错误的序列化器,让模板展示错误信息
    return Response({"serializer": serializer}, status=status.HTTP_400_BAD_REQUEST)

3. 优化序列化器(可选)

若需在响应中直接返回完整可访问的图片URL,可扩展序列化器:

from rest_framework import serializers
from images.models import Image

class PostSerializer(serializers.ModelSerializer):
    image_link = serializers.SerializerMethodField()

    class Meta:
        model = Image
        fields = ['image_url', 'expiring_within', 'image_link']

    def get_image_link(self, obj):
        # 生成完整的绝对访问URL
        return self.context['request'].build_absolute_uri(obj.image_url.url)

同时修改视图中序列化器初始化代码,传递request上下文:

serializer = PostSerializer(data=request.data, context={'request': request})

验证结果

  • 网页表单上传:添加enctype后,image_url会正确传递InMemoryUploadedFile对象,序列化器可通过验证,成功后页面展示图片链接
  • Postman调用:选择form-data类型上传文件,会返回包含图片链接的响应(根据配置返回模板页面或JSON数据)

内容的提问来源于stack exchange,提问作者djangobeginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:57:51