参考: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. 带图标的input

    <style> .text{ border:solid 2px #ccc; width:400px; height:40px; background:url(http://d.lanren ...

  2. 配置python学习环境遇到的问题:[Decode error - output not utf-8]

    因为前阵子学习monkeyrunner的时候,碰到了很多关于.py的脚本,其实我是一知半解的,也没打算去学习一下.将就着看看吧,后来无意中看到自动化测试工程师都要求会脚本语言的时候,刺激了我,想了想, ...

  3. Partial Tree(DP)

    Partial Tree http://acm.hdu.edu.cn/showproblem.php?pid=5534 Time Limit: / MS (Java/Others) Memory Li ...

  4. DOS 命令集锦——最常用命令

    一. 常用命令: cd 改变当前目录   sys 制作DOS系统盘 (电脑入门到精通网 www.58116.cn) copy 拷贝文件  del 删除文件 deltree 删除目录树    dir 列 ...

  5. js td innerHTML

    用value不好使,用innerHTML可以.JS:document.getElementById("aa").innerHTML="单元格"; body:&l ...

  6. redis缓存设置和读取

    一/写入 <?php $redis = new Redis(); //实例化redis $redis->pconnect('); $redis->,'huahua'); //设置变量 ...

  7. VMware下的Linux系统中Windows的共享目录,不支持创建软连接

    [问题]  在编译VMware下的Linux系统对从Windows中共享过来的文件,进行编译的时候,遇到:  ln: creating symbolic link XXXXXX : Operation ...

  8. [SoapUI] 比较JSON Response

    比较两个JSON, ID是数字时,处理成统一的格式:只保留小数点后5位 package direct; import org.json.JSONArray; import org.json.JSONE ...

  9. JDK和Eclipse的下载路径

    JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse http://www.eclipse.or ...

  10. stl学习记录(2)

    #include <iostream> #include <utility> #include <tuple> #include <complex> # ...