Django rest_framework 实现上传图片

在这里遇到了一个小问题(Unsupported media type \“multipart/form-data, 报错415)不过还好解决了。解决方法

models.py

# 轮播图
class Carousel(models.Model):
    # note = models.CharField(max_length=100)
    image = models.ImageField(upload_to="carousel")  # 轮播图图片

views.py

这里的视图继承ModelViewSet,需要注意的地方就是需要引入MultiPartParser,即下面这一行代码。

parser_classes = [MultiPartParser, JSONParser, FormParser]

不然就会报415的错误(Unsupported media type \“multipart/form-data)

class CarouselViewSet(ModelViewSet):
    parser_classes = [MultiPartParser, JSONParser, FormParser]
    """视图集"""
    queryset = models.Carousel.objects.all()
    serializer_class = CarouselModelSerializer
    # 搜索
    search_fields = ('id', 'image')

    # 添加轮播图
    @action(methods=['post'], detail=False)
    @csrf_exempt
    def add_carousel(self, request, *args, **kwargs):
        name = request.FILES.get('image', None)
        if name:
            print(name)
            obj = models.Carousel.objects.filter(image=name).first()
            if obj:
                return JsonResponse({
                    'status': '1001',
                    'msg': '已经存在此轮播图名称名称'
                })
            else:
                serializer = CarouselModelSerializer(data=request.data)

                if serializer.is_valid():
                    serializer.save()
                    return JsonResponse({
                        'status': '1000',
                        'msg': '添加成功'
                    })
                else:
                    return JsonResponse({
                        'status': '1002',
                        'msg': '插入数据不合法'
                    })
        else:
            return Response(status=status.HTTP_204_NO_CONTENT)

serializers.py

class CarouselModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Carousel
        fields = '__all__'

    def create(self, validated_data):
        return Carousel.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.image = validated_data.get('image', instance.image)
        instance.save()
        return instance

urls.py

urlpatterns = [
path('upload/', views.UpLoadInfo), # 用于测试上传的界面
  ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
router = SimpleRouter() 
router.register(r'carousel', views.CarouselViewSet)  # 注册路由
urlpatterns += router.urls  # 把生成好的路由拼接到urlpatterns

upload.html

用于测试上传的界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://127.0.0.1:8000/carousel/add_carousel/" method="post" enctype="multipart/form-data">
{#{% csrf_token %}#}
    <input name="image" type="file" >
    <button id="upload" type="submit">上传</button>
</form>
</body>
</html>

测试结果

在这里插入图片描述

可以看到返回的状态为1000(views.py自定义的状态码),上传成功
在这里插入图片描述

数据库中也已经存储成功,图片存储在文件夹中。
在这里插入图片描述

posted @ 2021-02-15 20:12  沃特艾文儿  阅读(97)  评论(0)    收藏  举报  来源