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()