Skip to main content
 首页 » 编程设计

python之在 django ImageField 的错误目录中上传图像

2024年11月24日25zengkefu

当我上传照片时,照片加载成功,但是照片放在了错误的目录。

而不是将图像放在 '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 View 中,你想替换这个:

Post.objects.filter(id=post.id).update( 
    title=request.POST['title'],                                                    
    index_pic=form.cleaned_data['index_pic'], 
    ) 

简单明了:

 form.save() 

这将负责更新作为 form.instance 传递的帖子(使用经过清理的数据,这不是您当前代码的情况)

FWIW,在您的 add_post View 中,您还想替换它

        new_post = form.save(commit=False) 
        new_post.index_pic = form.cleaned_data['index_pic'] 
        new_post.save() 

简单明了:

        new_post = form.save() 

再次重申,ModelForms 的全部意义在于它们知道如何创建和更新模型实例。