AttributeError:“字节"对象没有属性"_committed" [英] AttributeError: 'bytes' object has no attribute '_committed'

查看:112
本文介绍了AttributeError:“字节"对象没有属性"_committed"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有< input type ="file"> 的表单,尝试保存上传的图像时出现错误.该图像通过POST XMLHttpRequest上传.我不知道为什么会这样.

I have a form with an <input type="file">, and I'm getting an error when I try to save the uploaded image. The image is uploaded via POST XMLHttpRequest. I have no idea why this is happening.

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:

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":

template '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'

可能是什么问题?

推荐答案

您仅上传单个文件;您不应该遍历文件密钥.

You're only uploading a single file; you shouldn't be iterating over the file key.

def upload_file(request):
    key = f'{request.user}-{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}'
    file = request.FILES.get('file')
    if file:
        img = TemporaryImage(image=file, key=key)
        img.save()

这篇关于AttributeError:“字节"对象没有属性"_committed"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆