在 django ImageField 的错误目录中上传图像
Upload Image in the wrong directory in django ImageField
上传照片时,照片加载成功,但是照片放错目录了
图像没有放在 'media/posts-pics/'
的路径上 - 正如我在 Post 模型中概述的那样 - 它被放置在 'media'
路径上。
这些是我的文件:
models.py
class Post(models.Model):
index_pic = models.ImageField(upload_to='posts-pics/')
Project.urls.py
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py
def add_post(request):
if request.method == "POST":
form = AddPostForm(request.POST, request.FILES)
if form.is_valid():
new_post = form.save(commit=False)
new_post.index_pic = form.cleaned_data['index_pic']
new_post.save()
return redirect('view_post')
else:
form = AddPostForm()
template = 'post/add_edit_post.html'
context = {'form': form}
return render(request, template, context)
def edit_post(request, slug):
post = get_object_or_404(Post, slug=slug)
if request.method == "POST":
form = AddPostForm(request.POST, request.FILES, instance=post)
if form.is_valid():
Post.objects.filter(id=post.id).update(title=request.POST['title'],
index_pic=form.cleaned_data['index_pic'],
)
return redirect('view_post')
else:
form = AddPostForm(instance=post)
template = 'post/add_edit_post.html'
context = {'form': form}
return render(request, template, context)
我在 add_post
中使用了完全相同的代码,照片就在原处,但我在 edit_post
中遇到了麻烦。 怎么了?
通知:
Technically I can delete 'media/post-pics'
but this is done with a
special purpose and the purpose is: Each app have its folder for
saving images.
问题是您没有以正确的方式使用 ModelForm
。
在 edit_post 视图中,您要替换为:
Post.objects.filter(id=post.id).update(
title=request.POST['title'],
index_pic=form.cleaned_data['index_pic'],
)
简单明了:
form.save()
这将负责更新作为 form.instance
传递的 post(使用经过清理的数据,您当前的代码不是这种情况)
FWIW,在您的 add_post 视图中,您还想替换此
new_post = form.save(commit=False)
new_post.index_pic = form.cleaned_data['index_pic']
new_post.save()
简单明了:
new_post = form.save()
再次重申,ModelForms 的全部意义在于它们知道如何创建和更新模型实例。
上传照片时,照片加载成功,但是照片放错目录了
图像没有放在 'media/posts-pics/'
的路径上 - 正如我在 Post 模型中概述的那样 - 它被放置在 'media'
路径上。
这些是我的文件:
models.py
class Post(models.Model):
index_pic = models.ImageField(upload_to='posts-pics/')
Project.urls.py
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py
def add_post(request):
if request.method == "POST":
form = AddPostForm(request.POST, request.FILES)
if form.is_valid():
new_post = form.save(commit=False)
new_post.index_pic = form.cleaned_data['index_pic']
new_post.save()
return redirect('view_post')
else:
form = AddPostForm()
template = 'post/add_edit_post.html'
context = {'form': form}
return render(request, template, context)
def edit_post(request, slug):
post = get_object_or_404(Post, slug=slug)
if request.method == "POST":
form = AddPostForm(request.POST, request.FILES, instance=post)
if form.is_valid():
Post.objects.filter(id=post.id).update(title=request.POST['title'],
index_pic=form.cleaned_data['index_pic'],
)
return redirect('view_post')
else:
form = AddPostForm(instance=post)
template = 'post/add_edit_post.html'
context = {'form': form}
return render(request, template, context)
我在 add_post
中使用了完全相同的代码,照片就在原处,但我在 edit_post
中遇到了麻烦。 怎么了?
通知:
Technically I can delete
'media/post-pics'
but this is done with a special purpose and the purpose is: Each app have its folder for saving images.
问题是您没有以正确的方式使用 ModelForm
。
在 edit_post 视图中,您要替换为:
Post.objects.filter(id=post.id).update(
title=request.POST['title'],
index_pic=form.cleaned_data['index_pic'],
)
简单明了:
form.save()
这将负责更新作为 form.instance
传递的 post(使用经过清理的数据,您当前的代码不是这种情况)
FWIW,在您的 add_post 视图中,您还想替换此
new_post = form.save(commit=False)
new_post.index_pic = form.cleaned_data['index_pic']
new_post.save()
简单明了:
new_post = form.save()
再次重申,ModelForms 的全部意义在于它们知道如何创建和更新模型实例。