參考:https://blog.csdn.net/it_yuan/article/details/53580756
背景:
之前的博客是不支持上傳文章縮略圖的,后來新增了此功能,但是發現修改老的文章時,新增的圖片沒有上傳到服務器
僅僅是將圖片的名字添加到了數據庫
原因:
在修改的時候直接update了:
ArticlePost.objects.filter(id=article_id).update(title=title, body=body, column_id=column_id, avatar=avatar)
由於是使用Django的form表單傳遞的數據,所以要使用ModelForm.save()的方式來更新數據
解決:
article = ArticlePost.objects.get(id=article_id) # 從數據庫先取出具體的model對象article # 將此model對象作為instance的參數值傳入form。save(),同時還有request.POST,和request.FILES參數, # 這樣在save的時候就會update對應的model對象 article_post_form = ArticlePostForm(request.POST, request.FILES, instance=article) if article_post_form.is_valid(): cd = article_post_form.cleaned_data try: # 此處的save有commit=False參數,意思是只生成model對象,而不保存,生成的model對象new_article就可以修改了 new_article = article_post_form.save(commit=False) new_article.avatar = request.FILES.get('avatar') new_article.title = request.POST['title'] new_article.body = request.POST['body'] new_article.column_id = request.POST['column_id'] print('開始保存') new_article.save() # ArticlePost.objects.filter(id=article_id).update(title=title, body=body, column_id=column_id, avatar=avatar) print('保存成功') return HttpResponse('1') except: return HttpResponse('2')
深入分析:
使用ModelForm.save()方法有以下幾種情況:
1、直接保存數據
通過頁面post過來的數據 form接收 直接保存到數據庫,同時能夠產生對應的modes的一個新對象,為什么要產生,后面講....這個主要用來保存信息
article_post_form = ArticlePostForm(request.POST)
new_article = article_post_form.save()
2、查看數據
從數據庫中取出modes的對象,然后通過form參數instance方法能夠實例化該form,這個主要用來查看具體的信息
article = ArticlePost.objects.get(pk=1)
article_post_form = ArticlePostForm(instance=article)
article_post_form.save()
3、修改數據
既有post又有instance,則以post為主,這個主要用來修改信息
# 從數據庫先取出具體的model對象article article = ArticlePost.objects.get(id=article_id) # 將此model對象作為instance的參數值傳入form.save(),同時還有request.POST,和request.FILES參數, # 這樣在save的時候就會update對應的model對象 article_post_form = ArticlePostForm(request.POST, request.FILES, instance=article) # 此處的save有commit=False參數,意思是只生成model對象,而不保存,生成的model對象new_article就可以修改了 new_article = article_post_form.save(commit=False) new_article.avatar = request.FILES.get('avatar') new_article.title = request.POST['title'] new_article.body = request.POST['body'] new_article.column_id = request.POST['column_id'] new_article.save()