У меня есть форма с <input type="file">
, и я получаю сообщение об ошибке при попытке сохранить загруженное изображение. Изображение загружается через POST XMLHttpRequest. Я понятия не имею, почему это происходит.
views.py:
import datetime
from django.shortcuts import render
from .models import TemporaryImage
def upload_file(request):
key = f'{request.user}-{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
for file in request.FILES.get('file'):
img = TemporaryImage(image=file, key=key)
img.save()
def home_view(request):
return render(request, 'products/home.html', {})
models.py:
from django.db import models
def get_temp_image_path(instance, filename):
return os.path.join('tmp', str(instance.id), filename)
class TemporaryImage(models.Model):
image = models.ImageField(upload_to=get_temp_image_path, blank=True, null=True)
key = models.CharField(max_length=100)
urls.py:
from django.contrib import admin
from django.urls import path
from products.views import upload_file, home_view
urlpatterns = [
path('admin/', admin.site.urls),
path('', home_view, name='home'),
path('upload/', upload_file, name='upload_file')
]
шаблон 'home.html':
<!DOCTYPE html>
<html>
<head>
<title>SO Question</title>
<script>
function uploadFile() {
var fd = new FormData();
fd.append("file", document.getElementById('file').files[0]);
var value = [];
document.getElementsByName('csrfmiddlewaretoken').forEach(function(x) {
value.push(x.value);
})
fd.append('csrfmiddlewaretoken', value[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", '/upload/');
xhr.send(fd);
}
</script>
</head>
<body>
<form enctype="multipart/form-data" method="POST">
{% csrf_token %}
<label for="file">Select a File to Upload</label>
<input type="file" id="file" name="file">
<input type="button" onclick="uploadFile()" value="Upload">
</form>
</body>
</html>
трассировка полного стека:
[06/Oct/2019 12:05:40] "GET / HTTP/1.1" 200 968
request.FILES is <MultiValueDict: {'file': [<TemporaryUploadedFile: 20190615_193154.jpg (image/jpeg)>]}>
image is b'\xff\xd8\xff\xe1\\\xd5Exif\x00\x00II*\x00\x08\x00\x00\x00\x0c\x00\x00\x01\x04\x00\x01\x00\x00\x00 \x10\x00\x00\x01\x01\x04\x00\x01\x00\x00\x00\x18\x0c\x00\x00\x0f\x01\x02\x00\x08\x00\x00\x00\xae\x00\x00\x00\x10\x01\x02\x00\n'
Internal Server Error: /upload/
Traceback (most recent call last):
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/alex/.repos/codelib/practice/soq/src/soq/products/views.py", line 13, in upload_file
img.save()
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/base.py", line 741, in save
force_update=force_update, update_fields=update_fields)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/base.py", line 779, in save_base
force_update, using, update_fields,
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/base.py", line 870, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/base.py", line 908, in _do_insert
using=using, raw=raw)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/query.py", line 1186, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1334, in execute_sql
for sql, params in self.as_sql():
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1278, in as_sql
for obj in self.query.objs
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1278, in <listcomp>
for obj in self.query.objs
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1277, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1228, in pre_save_val
return field.pre_save(obj, add=True)
File "/home/alex/.repos/codelib/practice/soq/env/lib/python3.6/site-packages/django/db/models/fields/files.py", line 286, in pre_save
if file and not file._committed:
AttributeError: 'bytes' object has no attribute '_committed'
В чем может быть проблема?