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自定义的状态码),上传成功

数据库中也已经存储成功,图片存储在文件夹中。


浙公网安备 33010602011771号