django - 图片上传错误“检查表单上的编码类型。”
问题描述
在我的项目中,我需要上传一张图片作为我的玩家的头像,如我的models.py 所示:
class Player(models.Model):
number = models.IntegerField()
photo = models.ImageField(upload_to=upload_path, null=True, blank=True)
firstname = models.CharField(max_length=24)
lastname = models.CharField(max_length=24)
tag = models.CharField(max_length=8, blank=True)
color = models.CharField(max_length=10, null=True, blank=True)
selected = models.BooleanField(null = False, blank=True)
post = models.ForeignKey(Post, on_delete=models.SET_NULL, null=True)
def __str__(self):
return "#{}".format(
self.number,
)
我正在使用 Angular 来发送我的图像:
<input
type="file"
(change)="onNewPlayerPhotoChanged($event)"
accept="image/jpeg, image/png, image/jpg"
/>
& 在我的打字稿中
onNewPlayerPhotoChanged(event) {
this.newPlayerPhoto = event.target.files[0];
}
然后在我的提交按钮上我得到了
createPlayer() {
this.newPlayer.selected = false;
this.newPlayer.photo = this.newPlayerPhoto;
this.newPlayer.post_id = parseInt(this.newPlayerPost, 10);
this.playerService.create(this.newPlayer).subscribe(
res => {
this.getPlayerList();
this.openNewModal = false;
this.alertService.success('Joueur créé avec succès !');
setTimeout(() => this.alertService.clear(), 2000);
},
error => {
this.alertService.error(error);
setTimeout(() => this.alertService.clear(), 2000);
}
);
}
但我得到了错误:照片:[“提交的数据不是文件。检查表单上的编码类型。”]
这是我的 **views.py :**
class PlayerViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows Player to be viewed or edited.
"""
parser_classes = [JSONParser]
queryset = Player.objects.all()
serializer_class = PlayerSerializer
permission_classes = [IsAuthenticated, HasPermission, ]
def post(self, request, *args, **kwargs):
return HttpResponse({"message":request.FILES}, status=200)
print(request.FILES)
print(request.data)
photo = request.FILES['photo']
firstname = request.data['firstname']
lastname = request.data['lastname']
number = request.data['number']
tag = request.data['tag']
color = request.data['color']
selected = request.data['selected']
post = request.data['post']
Player.objects.create(photo=photo, firstname=firstname, lastname=lastname, number=number, tag=tag, color=color,
selected=selected, post=post)
return HttpResponse({'message':"Player created"}, status=200)
和我的serializers.py :
class PlayerSerializer(serializers.ModelSerializer):
post = PostSerializer(many=False, read_only=True)
post_id = serializers.PrimaryKeyRelatedField(source='post', write_only=True, queryset=Post.objects.all(),)
class Meta:
model = Player
fields = '__all__'
我按照那个教程https://www.youtube.com/watch?v=-36YauTh4Ts但他没有遇到那个错误,
如果有人可以提供帮助,将不胜感激。谢谢 !
编辑:我尝试在我的视图中使用 FileUploadParser 和 MultiPartParser 作为解析器,但它们都不起作用,FileUploadParser 会返回一个错误,说需要文件名,MultiPartParser 会返回一个错误,说他正在接收 JSON。
解决方案
推荐阅读
- python - 在 Python 的算法交易中使用 IB / TWS 的最佳方式是什么?
- extjs - 如何更改 extjs 中 PayPal 按钮的金额值?
- google-cloud-platform - 如何知道 GCP 存储桶中是否存在路径“gs://bucket1/folder_x”
- neo4j - Neo4j 数据库不会加载到我在 Windows 上的桌面应用程序中
- angular - 使用 AuthGaurd 重定向后,Angular router.navigate() 不起作用
- amazon-web-services - 过滤器不过滤 Terraform 中的子网
- javascript - 变量值在内部发生变化,事件处理程序在外部给出未定义
- python - ValueError:输入 0 层 bidirectional_1 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:(13、64)
- python - 生成特定日期的年龄
- linux - Docker overlay2:错误行走文件系统:OSError [Errno 40] 符号链接级别过多