参考:https://blog.csdn.net/it_yuan/article/details/53580756

背景:

  之前的博客是不支持上传文章缩略图的,后来新增了此功能,但是发现修改老的文章时,新增的图片没有上传到服务器

仅仅是将图片的名字添加到了数据库

原因:

  在修改的时候直接update了:

  1. ArticlePost.objects.filter(id=article_id).update(title=title, body=body, column_id=column_id, avatar=avatar)

由于是使用Django的form表单传递的数据,所以要使用ModelForm.save()的方式来更新数据

解决:

  

  1.      article = ArticlePost.objects.get(id=article_id)
  2. # 从数据库先取出具体的model对象article
  3. # 将此model对象作为instance的参数值传入form。save(),同时还有request.POST,和request.FILES参数,
  4. # 这样在save的时候就会update对应的model对象
  5. article_post_form = ArticlePostForm(request.POST, request.FILES, instance=article)
  6. if article_post_form.is_valid():
  7. cd = article_post_form.cleaned_data
  8. try:
  9. # 此处的save有commit=False参数,意思是只生成model对象,而不保存,生成的model对象new_article就可以修改了
  10. new_article = article_post_form.save(commit=False)
  11. new_article.avatar = request.FILES.get('avatar')
  12. new_article.title = request.POST['title']
  13. new_article.body = request.POST['body']
  14. new_article.column_id = request.POST['column_id']
  15.  
  16. print('开始保存')
  17. new_article.save()
  18. # ArticlePost.objects.filter(id=article_id).update(title=title, body=body, column_id=column_id, avatar=avatar)
  19. print('保存成功')
  20. return HttpResponse('')
  21. except:
  22. return HttpResponse('')

深入分析:

  使用ModelForm.save()方法有以下几种情况:

1、直接保存数据

  通过页面post过来的数据 form接收 直接保存到数据库,同时能够产生对应的modes的一个新对象,为什么要产生,后面讲....这个主要用来保存信息

  1. article_post_form = ArticlePostForm(request.POST)
    new_article = article_post_form.save()

2、查看数据

  从数据库中取出modes的对象,然后通过form参数instance方法能够实例化该form,这个主要用来查看具体的信息

  1. article = ArticlePost.objects.get(pk=1)
    article_post_form = ArticlePostForm(instance=article)
    article_post_form.save()

3、修改数据

  既有post又有instance,则以post为主,这个主要用来修改信息

  1. # 从数据库先取出具体的model对象article
  2. article = ArticlePost.objects.get(id=article_id)
  3. # 将此model对象作为instance的参数值传入form.save(),同时还有request.POST,和request.FILES参数,
  4. # 这样在save的时候就会update对应的model对象
  5. article_post_form = ArticlePostForm(request.POST, request.FILES, instance=article)
  6. # 此处的save有commit=False参数,意思是只生成model对象,而不保存,生成的model对象new_article就可以修改了
  7. new_article = article_post_form.save(commit=False)
  8. new_article.avatar = request.FILES.get('avatar')
  9. new_article.title = request.POST['title']
  10. new_article.body = request.POST['body']
  11. new_article.column_id = request.POST['column_id']
  12. 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. web程序的配置文件的修改

    vs上面的config与wwwroot中的config有可能不一样,注意修改配置的资源路径及ip及数据库及禁止ip

  2. cf-Round542-Div2-C(暴力+DFS)

    题目链接:http://codeforces.com/contest/1130/problem/C 思路: 利用DFS搜索(r1,c1)和(r2,c2)可到达的点的集合,分别存在a1,a2中,若a1= ...

  3. <cctype>库

    http://www.cplusplus.com/reference/cctype/ 函数名称 返回值 isalnum() 如果参数是字母数字,即字母或数字,该函数返回true isalpha() 如 ...

  4. Only POT texture can be compressed to PVRTC format

    在图片压缩格式 报这个Warning的时候,意思是该图片必须要采用2的幂次方大小才能使用该格式. POT: Power of Two. 采取方式是在advanced里边,把Non Power of 2 ...

  5. Infinity,NaN

    常量 说明 Infinity 表示正无穷大的特殊值. -Infinity 表示负无穷大的特殊值. NaN Number 数据类型的一个特殊成员,用来表示“非数字”(NaN) 值. undefined ...

  6. ECMAScript6新特性之Reflect

    一 Reflect.ownKeys()获取对象属性. 可枚举的.不可枚举的.自有的.继承的. let fruit = { '2' : 'mango', [Symbol.for('pink')] : ' ...

  7. Hibernate一级缓存(补)

    ------------------siwuxie095                                 什么是缓存         缓存是介于应用程序和永久性数据存储源(如:硬盘上的 ...

  8. php 使用PHPExcel 导出数据为Excel

    <?php require_once 'PHPExcel/Classes/PHPExcel.php'; /** * 导出数据为Excel * @param array $fieldArr 标题数 ...

  9. Python3编程技巧

    高效处理数据类型方法: In []: from random import randint In []: data=[randint(-,) )] In []: data Out[]: [-, -, ...

  10. jdk8 jvm配置参数说明

    这些选项是特定于Java HotSpot虚拟机的通用选项.-X 显示所有可用-X选项的帮助. -Xbatch 禁用后台编译.默认情况下,JVM将该方法编译为后台任务,以解释器模式运行该方法,直到后台编 ...