折腾了很长时间,经过查阅很多文档,最后找到了解决办法,现分享出来,希望可以给大家一点帮助,如果有更好的解决方法,请@我,谢谢。
转载,请标明,尊重原创,从你我他开始。
需求:通过iview-admin2.5的Upload上传组件,上传到后端的DRF的API接口。
问题:通过DRF自带的接口测试和xadmin后台测试,上传均正常。但通过iview过来的图片就无法上传。
解决办法:在serializers里面的def validate(self, validated_data): 对数据进行手动编辑,实现上传图片的保存和入库,但有一个前提条件,models.py的图片模型中的所有字段可以为空,不做效验。
这个方法很笨,有更好的办法,请@我,不吝赐教,谢谢?
上代码: form * import * 就不贴出来了
models.py
class UploadImage(models.Model):
"""
上传图片表
"""
name = models.CharField(default="", max_length=30, null=True, blank=True, verbose_name="图片名称", help_text="图片名称")
code = models.CharField(default="", max_length=30, null=True, blank=True, verbose_name="图片编码", help_text="图片编码")
image = models.ImageField(upload_to='static/images/%Y/%m/%d', null=True, blank=True, verbose_name="图片",
help_text="图片")
class Meta:
verbose_name = '图片列表'
verbose_name_plural = verbose_name
def __str__(self):
return "{0} {1}".format(self.name, self.code)
views.py
class UploadImageViewSet(mixins.ListModelMixin,mixins.RetrieveModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):
"""
上传图片列表
"""
queryset = UploadImage.objects.all()
serializer_class = UploadImageSerializer
parser_classes = (MultiPartParser, FormParser,)
serializers.py
class UploadImageSerializer(serializers.ModelSerializer):
# 获取当前的登录用户
creator = serializers.HiddenField(
default=serializers.CurrentUserDefault(), write_only=True
)
# image = serializers.ImageField(max_length=None, use_url=True, label="图片", help_text="图片" )
class Meta:
model = UploadImage
fields = ('id', 'name', 'image', 'creator')
def validate(self, validated_data):
# 通过iview Upload上传图片是,图片在FormData里面,DRF无法获取"UploadImage"的对应字段,需要在validate里面手动添加
# 当validated_data里面没有image时,即为iview Upload组件上传,需要手动编辑一下validated_data。
# xadmin和 DRF自带接口测试使用的FORM multipart/form-data 的post提交,不需要编辑validated_data
if not validated_data.get('image', False):
validated_data['name'] = ''
validated_data['image'] = self.initial_data.get('file', 'Data retrieval error')
# other validation logic
return validated_data
iview-admin的Upload组件,
<Upload
ref="imageUpload"
action="//127.0.0.1:8026/upload/"
</Upload>