带有Django的Javascript XMLHttpRequest

带有Django的Javascript XMLHttpRequest,javascript,python,django,django-models,xmlhttprequest,Javascript,Python,Django,Django Models,Xmlhttprequest,我正试图用fetch将一些照片用React JS发送到Django。然后我想用Django将这些照片保存到数据库中 处理发送照片的React JS功能如下: handleAdd(e){ e.preventDefault(); let data = this.state.data; let pictures = this.state.pictures; let body = new FormData(); body.

我正试图用
fetch
将一些照片用
React JS
发送到
Django
。然后我想用Django将这些照片保存到数据库中

处理发送照片的
React JS
功能如下:

handleAdd(e){
        e.preventDefault();
        let data = this.state.data;
        let pictures = this.state.pictures;

        let body = new FormData();
        body.append('data', JSON.stringify(data));

        if (pictures.length > 0){
            _.each(pictures, (picture, i) => {
                body.append('pictures', picture);
            });
        }    

        let xhr = new XMLHttpRequest();
        xhr.open('POST', `http://localhost:8000/master/api/add-inspection/`);
        xhr.setRequestHeader("Authorization", "Token vEdD9t701LtDaCZYrSEutHKSNnAuUFAV");
        xhr.onload = e => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    console.log("Status 200");
                } else {
                    console.log("Error");
                }
            }
        };
        xhr.onerror = e => {
            console.log("Error " + e);
        };
        xhr.send(body);
    }
@token_required
@transaction.atomic
def add_inspection(request):
    if request.method == "POST":
        data = json.loads(request.POST.get('data'))
        pictures = request.FILES

        n_inspection = Inspection()
        n_inspection.user_id = data['user']['id']
        n_inspection.data = json.dumps(data)
        n_inspection.save()

        save_pictures(n_inspection, pictures)

        return HttpResponse("Its ok.", status=200)
    else:
        return HttpResponse("Something went wrong.", status=400)
def save_pictures(inspection, pictures):

    print(pictures)  // Gives me <MultiValueDict: {'pictures': [<InMemoryUploadedFile: samsung-s8.png (image/png)>, <InMemoryUploadedFile: Simulator Screen Shot 6 Jul 2017, 15.43.55.png (image/png)>]}>

    for picture in pictures['pictures']:
        n_picture = InspectionPictures()
        n_picture.inspection_id = inspection.id
        n_picture.picture = picture

        print(picture) // first iteration : b'\x89PNG\r\n'

        n_picture.save()
def inspection_picture_path(self, filename):
    return 'inspection_{0}/{1}'.format(self.inspection.id, filename)


class InspectionPictures(models.Model):
    inspection = models.ForeignKey(Inspection, on_delete=models.CASCADE)
    picture = models.FileField(upload_to=inspection_picture_path, blank=True)

    def __str__(self):
        return "Inspection-{}".format(self.inspection.id)
然后是Django

settings.py
中,我有
MEDIA\u ROOT
MEDIA\u URL

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'master/static/master/img/inspection_pictures'),
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'master/static/master/img/inspection_pictures'),)
添加检查
视图如下所示:

handleAdd(e){
        e.preventDefault();
        let data = this.state.data;
        let pictures = this.state.pictures;

        let body = new FormData();
        body.append('data', JSON.stringify(data));

        if (pictures.length > 0){
            _.each(pictures, (picture, i) => {
                body.append('pictures', picture);
            });
        }    

        let xhr = new XMLHttpRequest();
        xhr.open('POST', `http://localhost:8000/master/api/add-inspection/`);
        xhr.setRequestHeader("Authorization", "Token vEdD9t701LtDaCZYrSEutHKSNnAuUFAV");
        xhr.onload = e => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    console.log("Status 200");
                } else {
                    console.log("Error");
                }
            }
        };
        xhr.onerror = e => {
            console.log("Error " + e);
        };
        xhr.send(body);
    }
@token_required
@transaction.atomic
def add_inspection(request):
    if request.method == "POST":
        data = json.loads(request.POST.get('data'))
        pictures = request.FILES

        n_inspection = Inspection()
        n_inspection.user_id = data['user']['id']
        n_inspection.data = json.dumps(data)
        n_inspection.save()

        save_pictures(n_inspection, pictures)

        return HttpResponse("Its ok.", status=200)
    else:
        return HttpResponse("Something went wrong.", status=400)
def save_pictures(inspection, pictures):

    print(pictures)  // Gives me <MultiValueDict: {'pictures': [<InMemoryUploadedFile: samsung-s8.png (image/png)>, <InMemoryUploadedFile: Simulator Screen Shot 6 Jul 2017, 15.43.55.png (image/png)>]}>

    for picture in pictures['pictures']:
        n_picture = InspectionPictures()
        n_picture.inspection_id = inspection.id
        n_picture.picture = picture

        print(picture) // first iteration : b'\x89PNG\r\n'

        n_picture.save()
def inspection_picture_path(self, filename):
    return 'inspection_{0}/{1}'.format(self.inspection.id, filename)


class InspectionPictures(models.Model):
    inspection = models.ForeignKey(Inspection, on_delete=models.CASCADE)
    picture = models.FileField(upload_to=inspection_picture_path, blank=True)

    def __str__(self):
        return "Inspection-{}".format(self.inspection.id)
其中,
保存图片
功能如下:

handleAdd(e){
        e.preventDefault();
        let data = this.state.data;
        let pictures = this.state.pictures;

        let body = new FormData();
        body.append('data', JSON.stringify(data));

        if (pictures.length > 0){
            _.each(pictures, (picture, i) => {
                body.append('pictures', picture);
            });
        }    

        let xhr = new XMLHttpRequest();
        xhr.open('POST', `http://localhost:8000/master/api/add-inspection/`);
        xhr.setRequestHeader("Authorization", "Token vEdD9t701LtDaCZYrSEutHKSNnAuUFAV");
        xhr.onload = e => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    console.log("Status 200");
                } else {
                    console.log("Error");
                }
            }
        };
        xhr.onerror = e => {
            console.log("Error " + e);
        };
        xhr.send(body);
    }
@token_required
@transaction.atomic
def add_inspection(request):
    if request.method == "POST":
        data = json.loads(request.POST.get('data'))
        pictures = request.FILES

        n_inspection = Inspection()
        n_inspection.user_id = data['user']['id']
        n_inspection.data = json.dumps(data)
        n_inspection.save()

        save_pictures(n_inspection, pictures)

        return HttpResponse("Its ok.", status=200)
    else:
        return HttpResponse("Something went wrong.", status=400)
def save_pictures(inspection, pictures):

    print(pictures)  // Gives me <MultiValueDict: {'pictures': [<InMemoryUploadedFile: samsung-s8.png (image/png)>, <InMemoryUploadedFile: Simulator Screen Shot 6 Jul 2017, 15.43.55.png (image/png)>]}>

    for picture in pictures['pictures']:
        n_picture = InspectionPictures()
        n_picture.inspection_id = inspection.id
        n_picture.picture = picture

        print(picture) // first iteration : b'\x89PNG\r\n'

        n_picture.save()
def inspection_picture_path(self, filename):
    return 'inspection_{0}/{1}'.format(self.inspection.id, filename)


class InspectionPictures(models.Model):
    inspection = models.ForeignKey(Inspection, on_delete=models.CASCADE)
    picture = models.FileField(upload_to=inspection_picture_path, blank=True)

    def __str__(self):
        return "Inspection-{}".format(self.inspection.id)
但是当它需要保存照片(
n\u picture.save()
)时,我得到内部服务器错误(AttributeError:'bytes'对象没有属性'\u committed'

整个误差如下:

handleAdd(e){
        e.preventDefault();
        let data = this.state.data;
        let pictures = this.state.pictures;

        let body = new FormData();
        body.append('data', JSON.stringify(data));

        if (pictures.length > 0){
            _.each(pictures, (picture, i) => {
                body.append('pictures', picture);
            });
        }    

        let xhr = new XMLHttpRequest();
        xhr.open('POST', `http://localhost:8000/master/api/add-inspection/`);
        xhr.setRequestHeader("Authorization", "Token vEdD9t701LtDaCZYrSEutHKSNnAuUFAV");
        xhr.onload = e => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    console.log("Status 200");
                } else {
                    console.log("Error");
                }
            }
        };
        xhr.onerror = e => {
            console.log("Error " + e);
        };
        xhr.send(body);
    }
@token_required
@transaction.atomic
def add_inspection(request):
    if request.method == "POST":
        data = json.loads(request.POST.get('data'))
        pictures = request.FILES

        n_inspection = Inspection()
        n_inspection.user_id = data['user']['id']
        n_inspection.data = json.dumps(data)
        n_inspection.save()

        save_pictures(n_inspection, pictures)

        return HttpResponse("Its ok.", status=200)
    else:
        return HttpResponse("Something went wrong.", status=400)
def save_pictures(inspection, pictures):

    print(pictures)  // Gives me <MultiValueDict: {'pictures': [<InMemoryUploadedFile: samsung-s8.png (image/png)>, <InMemoryUploadedFile: Simulator Screen Shot 6 Jul 2017, 15.43.55.png (image/png)>]}>

    for picture in pictures['pictures']:
        n_picture = InspectionPictures()
        n_picture.inspection_id = inspection.id
        n_picture.picture = picture

        print(picture) // first iteration : b'\x89PNG\r\n'

        n_picture.save()
def inspection_picture_path(self, filename):
    return 'inspection_{0}/{1}'.format(self.inspection.id, filename)


class InspectionPictures(models.Model):
    inspection = models.ForeignKey(Inspection, on_delete=models.CASCADE)
    picture = models.FileField(upload_to=inspection_picture_path, blank=True)

    def __str__(self):
        return "Inspection-{}".format(self.inspection.id)
内部服务器错误:/master/api/添加检查/ 回溯(最近一次呼叫最后一次): 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/core/handlers/exception.py”,第39行,内部 响应=获取响应(请求) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/core/handlers/base.py”,第187行,在“get_”回复中 response=self.process\u异常\u由\u中间件(e,请求) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/core/handlers/base.py”,第185行,在“get_”回复中 响应=包装的回调(请求,*回调参数,**回调参数) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/views/decorators/csrf.py”,第58行,包装视图 返回视图函数(*args,**kwargs) 文件“/Users/boris/Projects/car\u inspection/car\u inspection/api/authentication.py”,第71行,在视图中 返回视图功能(请求,*args,**kwargs) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/contextlib.py”,第53行,在内部 返回函数(*args,**kwds) 文件“/Users/boris/Projects/car\u inspection/car\u inspection/api/views.py”,第29行,添加检查 保存图片(n\u检查,图片) 文件“/Users/boris/Projects/car\u inspection/car\u inspection/api/views.py”,第47行,保存图片 n_picture.save() 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/base.py”,第796行,保存 强制更新=强制更新,更新字段=更新字段) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/base.py”,第824行,在save_base中 更新=自我。保存表格(原始、cls、强制插入、强制更新、使用、更新字段) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/base.py”,第908行,保存在表格中 结果=self.\u do\u insert(cls.\u base\u manager,using,fields,update\u pk,raw) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/base.py”,第947行,插入 使用=使用,原始=原始) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/manager.py”,第85行,在manager_方法中 返回getattr(self.get_queryset(),name)(*args,**kwargs) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/query.py”,第1045行,插入 return query.get\u编译器(using=using).execute\u sql(return\u id) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第1053行,在execute_sql中 对于sql,self.as_sql()中的参数为: as_sql中的文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第1006行 对于self.query.objs中的obj 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第1006行,在 对于self.query.objs中的obj 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第1005行,在 [self.prepare_值(字段,self.pre_保存值(字段,对象))用于字段中的字段] 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/sql/compiler.py”,第955行,保存前 返回字段。预保存(obj,add=True) 文件“/Users/boris/Projects/car_inspection/venv/lib/python3.6/site packages/django/db/models/fields/files.py”,第290行,保存前 如果是文件而不是文件。\u提交: AttributeError:“bytes”对象没有属性“\u committed”


这里有很多错误。除此之外,您还没有将上传的文件内容保存到任何地方,因此这无法正常工作。我建议您阅读-正如这里所建议的,最简单的方法是通过一个模型来实现这一点。@DanielRoseman好的,您能告诉我这里有什么问题吗?我使用React作为前端,我不能使用modelform。我告诉过你了。我看不出这些事情有什么关系。当然,你可以将模型与React结合使用。@DanielRoseman不,先生,你没有。你说:“这里有很多错误。”。但你只说了一句“错”的话:“除了别的以外,…”。我知道这是可以做到的,当然我在阅读文档时也试图解决它,但我无法将它应用到我的例子和我的问题中,这就是为什么我在这里寻求帮助。把链接放在文档和“这里有问题”上对我没有帮助。