带有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不,先生,你没有。你说:“这里有很多错误。”。但你只说了一句“错”的话:“除了别的以外,…”。我知道这是可以做到的,当然我在阅读文档时也试图解决它,但我无法将它应用到我的例子和我的问题中,这就是为什么我在这里寻求帮助。把链接放在文档和“这里有问题”上对我没有帮助。