Я склоняюсь к тому, как загружать файл в Django, и здесь я сталкиваюсь с непростой задачей с ошибкой:
Представленные данные не были файлом. Проверьте тип кодировки в форме.
Ниже представлена подробная информация.
Примечание: Я также рассмотрел Django Rest Framework ImageField, и я попробовал
serializer = ImageSerializer(data=request.data, files=request.FILES)
но я получаю
TypeError:
__init__()
получил неожиданный аргумент ключевого слова 'files'
У меня есть модель 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.'])])
Интересно, что я должен сделать, чтобы исправить ошибку?
EDIT: JS часть
Связанные коды front end состоят из двух частей: a angular-file-dnd
directive
(доступно здесь) для удаления файла на страницу и 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
, который отправляет данные изображения в надлежащем формате.