Python 我的Django图像在尝试更新时无法上载
我正在用django建立一个博客,我成功地创建了一个新帖子,但是当我尝试更新帖子时,所有内容都更新了,但是图片没有更新,它没有将图片上传到Posts模型中的upload_to 这是我的密码 view.pyPython 我的Django图像在尝试更新时无法上载,python,django,python-3.x,Python,Django,Python 3.x,我正在用django建立一个博客,我成功地创建了一个新帖子,但是当我尝试更新帖子时,所有内容都更新了,但是图片没有更新,它没有将图片上传到Posts模型中的upload_to 这是我的密码 view.py @login_required def UpdatePost(request, pk): obj = get_object_or_404(Posts, id=pk) myForm = NewPostForm(instance = obj) if request.meth
@login_required
def UpdatePost(request, pk):
obj = get_object_or_404(Posts, id=pk)
myForm = NewPostForm(instance = obj)
if request.method == 'POST':
myForm = NewPostForm(request.POST, request.FILES, instance=request.user.profile)
response_data = {
'SType': 'danger',
'message': "An Error Occured, pls try again later"
}
title = request.POST.get('title')
content = request.POST.get('content')
category_id = request.POST.get('category')
image = request.FILES.get('image')
if myForm.is_valid():
if Posts.objects.filter(pk=pk).update(title=title, content=content, image=image, category_id=category_id, author_id=request.user.id):
response_data = {
'SType': 'success',
'message': "Saved Successfully"
}
return HttpResponse(json.dumps(response_data), content_type="application/json")
context={
'form':myForm,
'title': obj.title,
'category': Category.objects.all()
}
return render(request, 'blog/update.html', context)
update.html
<form action="." method="POST" enctype="multipart/form-data" id="PostNew__form"> {% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Update a Blog Post</legend>
<div class="form-row">
<div class="form-group col-md-8 mb-0">
{{ form.title | as_crispy_field }}
</div>
<div class="form-group col-md-4 mb-0">
{{ form.category | as_crispy_field }}
</div>
</div>
{{ form.content | as_crispy_field }}
<div class="">
{{ form.image | as_crispy_field }}
</div>
</fieldset>
<div class="form-group">
<h6 id="PostNew__show" ></h6>
<img src=" {% static 'images/ajax-loader.gif' %}" style="Display:none;" id="PostNew__img">
<button class="btn btn-outline-info float-right" type="submit" id="PostNew__submit">Update</button>
</div>
</form>
forms.py
class NewPostForm(forms.ModelForm):
class Meta:
model = Posts
fields = ['title', 'category', 'content', 'image']
请告诉我如何解决这个问题,在数据库中,它存储了文件名,但只是名称,没有Django文档中的upload_to文件夹,它显示了如何通过创建
模型实例将文件上载到模型。queryset上的update()
方法不执行相同的操作,它通过快捷方式分配字段来执行数据库查询。因此它实际上不会将图像文件保存到存储器中
您应该在保存前直接分配实例的文件字段,或者只保存表单。您不必查询数据库,因为您已经有了传递给表单的实例。因此,要么这样做:
obj.image = image
obj.title = form.cleaned_data['title']
...
obj.save()
或者,由于您已经有了一个ModelForm,您可以这样做:
form.save()
但是请注意,实例化表单的代码是错误的:
form = NewPostForm(request.POST, request.FILES, instance=obj) # not request.user.profile
如果表单无法直接保存,因为您的模型需要的字段不是表单的一部分,那么您应该使用commit=False
:
post = form.save(commit=False)
post.author = request.user # and assign other fields that are not part of the form
post.save()
如果您使用的是ModelForm
,为什么不保存表单而不是使用update()
?(另外,您通常不应该将request.POST[field]
保存到您的模型中,而应该将form.cleaned\u data[field]
保存到模型中,因为这是安全的。)此外,您的表单初始化错误:使用instance=obj
而不是instance=request.user.profile
是,我试过了,但没有成功,这是因为您将错误的实例传递给表单
post = form.save(commit=False)
post.author = request.user # and assign other fields that are not part of the form
post.save()