【发布时间】:2015-03-18 03:41:08
【问题描述】:
我正在学习如何在 Django 中上传文件,在这里我遇到了一个应该是微不足道的问题,错误:
提交的数据不是文件。检查表单上的编码类型。
以下是详细信息。
注意:我也看了Django Rest Framework ImageField,我试过了
serializer = ImageSerializer(data=request.data, files=request.FILES)
但我明白了
TypeError:
__init__()得到了一个意外的关键字参数“文件”
我有一个 Image 模型,我想通过 Django REST 框架与之交互:
models.py
class Image(models.Model):
image = models.ImageField(upload_to='item_images')
owner = models.ForeignKey(
User, related_name='uploaded_item_images',
blank=False,
)
time_created = models.DateTimeField(auto_now_add=True)
serializers.py
class ImageSerializer(serializers.ModelSerializer):
image = serializers.ImageField(
max_length=None, use_url=True,
)
class Meta:
model = Image
fields = ("id", 'image', 'owner', 'time_created', )
settings.py
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
),
前端(使用AngularJS和angular-restmod或$resource)发送JSON数据与owner和image的形式:
输入:
{"owner": 5, "image": "data:image/jpeg;base64,/9j/4QqdRXhpZgAATU0A..."}
在后台显示request.data
{u'owner': 5, u'image': u'data:image/jpeg;base64,/9j/4QqdRXhpZgAATU0AKgAAA..."}
但随后ImageSerializer(data=request.data).errors 显示错误
ReturnDict([('image', [u'The submitted data was not a file. Check the encoding type on the form.'])])
我想知道我应该怎么做才能修复这个错误?
编辑:JS 部分
相关的前端代码由两部分组成:angular-file-dnddirective(可用here)将文件拖放到页面上,angular-restmod提供CRUD操作:
<!-- The template: according to angular-file-dnd, -->
<!-- it will store the dropped image into variable $scope.image -->
<div file-dropzone="[image/png, image/jpeg, image/gif]" file="image" class='method' data-max-file-size="3" file-name="imageFileName">
<div layout='row' layout-align='center'>
<i class="fa fa-upload" style='font-size:50px;'></i>
</div>
<div class='text-large'>Drap & drop your photo here</div>
</div>
# A simple `Image` `model` to perform `POST`
$scope.image_resource = Image.$build();
$scope.upload = function() {
console.log("uploading");
$scope.image_resource.image = $scope.image;
$scope.image_resource.owner = Auth.get_profile().user_id;
return $scope.image_resource.$save();
};
关于该问题的更新:现在我切换到使用ng-file-upload,它以正确的格式发送图像数据。
【问题讨论】:
-
你能更新你的代码以包含你用来发布数据的表单和任何相关的js吗?
-
@JamieCounsell:我已经添加了上面的代码。不过我没有使用
<form>标签。 -
@Lelouch :
"image": "data:image/jpeg;base64,/9j/4QqdRXhpZgAATU0A..."这是什么文件格式?? -
@Lelouch 你能分享一下这个的最终解决方案吗
标签: python angularjs django django-rest-framework