参考: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('')
except:
return HttpResponse('')

深入分析:

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

Django:form.save()方法的更多相关文章

  1. django form POST方法提交表达

    之前就着手开始尝试用django来简化web开发的流程周期,果不其然,速度还行,当然前期的产品那就相当粗糙了.举例来说,就连最基本的登录都是抄别人的,最可怕的是用GET方法提交表单,今天就尝试解决这个 ...

  2. django的save方法被调用时数据是如何被保存的

    发送一个django.db.models.signals.pre_save信号,以允许监听该信号的函数完成一些自定义操作. 预处理数据.如果需要,对对象的每个字断进行自动转换. 准备数据库数据.要求咩 ...

  3. Django——form组件和ModelForm

    一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...

  4. django model form 保存方法 django-rest-framework save 修改某一项值 方法

    django Model Form django-rest-framework save 方法 修改某个数据的值

  5. django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息

    django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...

  6. Django 资源 与 知识 Django中自建脚本并使用Django环境 model中的save()方法说明 filter()用法

    Django 资源 与 知识 Django中自建脚本并使用Django环境 model中的save()方法说明 filter()用法 2018/11/06 Chenxin 资料说明 Django基础入 ...

  7. Django create和save方法

    Django的模型(Model)的本质是类,并不是一个具体的对象(Object).当你设计好模型后,你就可以对Model进行实例化从而创建一个一个具体的对象.Django对于创建对象提供了2种不同的s ...

  8. Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)

    1. 在app下 新建 forms.py 定义表单内容,类型models from django import forms class RegisterForm(forms.Form): userna ...

  9. 覆盖Django mysql model中save方法时碰到的一个数据库更新延迟问题

    最近有一个需求,通过django的admin后台,可以人工配置5张表的数据,这些数据进行一些业务规则处理后会统一成一份数据缓存在一个cache之中供服务端业务访问,因而任何一张表的数据更新(增.删.改 ...

随机推荐

  1. hdoj2612 Find a way (bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 思路: 这个题我wa了十多发QAQ. 刚开始的思路是搜索每个‘@’,然后广搜该点到Y和M的最小距 ...

  2. 【英宝通Unity4.0公开课学习 】(一)资源管理

    经过多次面试后发现自己对Unity3D的框架缺乏一个整体的认识. 而前面由于离职等原因总是忙于修修补补,疲于奔命,感觉相当疲惫. 还好,后来经过调整,开始淡定了起来.得特别感谢一本书哇:<高效人 ...

  3. Excel单元格内容批量加前缀

    比如83190001在A1单元格,要在A列单元内容前面批量加0,在B1输入公式="0"&A1然后向下复制再把B列复制的结果再复制一下:然后到新的一列粘贴,在“粘贴选项”中选 ...

  4. c语言定义函数指针和typedef简写

    二种方法来定义函数指针 #include<stdio.h> #include<stdlib.h> #include<Windows.h> int add(int a ...

  5. shell中数组基础语法

    数组的基本赋值 arr=(a b c) arr[index]=a 2.常用的两个方法 str=${arr[@]}(数组转化成字符串) len=${#arr[*]}(数组长度) 3.遍历数组的方法 #! ...

  6. HttpApplicationState与HttpApplication

    HttpApplicationState 类的单个实例在客户端第一次从某个特定的 ASP.NET 应用程序虚拟目录中请求任何 URL 资源时创建.对于 Web 服务器上的每个 ASP.NET 应用程序 ...

  7. Pycharm及python安装详细教程

    首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载. 2. ...

  8. url地址 参数 带 参数 注意事项 , chain , redirect , redirectAction

    当 url  地址中含有  参数 时 ,若参数值是一个 含有 参数的 地址时 , 应警惕 ,如 index/goIndex!login?backUrl=/shop/goShop!go?a1=1& ...

  9. 打开jsp页面时,显示空白页。

    打开jsp页面时,显示空白页.   #foreach($e in $listPlanItem)          #set($listPlanDetail=$!e.get(2))        < ...

  10. Angular 通过注入 $location 获取与修改当前页面URL

    //1.获取当前完整的url路径 var absurl = $location.absUrl(); //http://172.16.0.88:8100/#/homePage?id=10&a=1 ...