Django:form.save()方法


參考: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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM