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('')
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()方法的更多相关文章
- django form POST方法提交表达
		
之前就着手开始尝试用django来简化web开发的流程周期,果不其然,速度还行,当然前期的产品那就相当粗糙了.举例来说,就连最基本的登录都是抄别人的,最可怕的是用GET方法提交表单,今天就尝试解决这个 ...
 - django的save方法被调用时数据是如何被保存的
		
发送一个django.db.models.signals.pre_save信号,以允许监听该信号的函数完成一些自定义操作. 预处理数据.如果需要,对对象的每个字断进行自动转换. 准备数据库数据.要求咩 ...
 - Django——form组件和ModelForm
		
一.原生form实现书城增删改查 1.构建模型并完成数据库迁移 (1)构建书城模型 from django.db import models # Create your models here. # ...
 - django model form 保存方法 django-rest-framework save 修改某一项值 方法
		
django Model Form django-rest-framework save 方法 修改某个数据的值
 - django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息
		
django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...
 - Django 资源 与 知识 Django中自建脚本并使用Django环境 model中的save()方法说明 filter()用法
		
Django 资源 与 知识 Django中自建脚本并使用Django环境 model中的save()方法说明 filter()用法 2018/11/06 Chenxin 资料说明 Django基础入 ...
 - Django create和save方法
		
Django的模型(Model)的本质是类,并不是一个具体的对象(Object).当你设计好模型后,你就可以对Model进行实例化从而创建一个一个具体的对象.Django对于创建对象提供了2种不同的s ...
 - Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)
		
1. 在app下 新建 forms.py 定义表单内容,类型models from django import forms class RegisterForm(forms.Form): userna ...
 - 覆盖Django mysql model中save方法时碰到的一个数据库更新延迟问题
		
最近有一个需求,通过django的admin后台,可以人工配置5张表的数据,这些数据进行一些业务规则处理后会统一成一份数据缓存在一个cache之中供服务端业务访问,因而任何一张表的数据更新(增.删.改 ...
 
随机推荐
- malloc、free、new、delete
			
一.C语言中不定大小多维数组的处理: 如果要给二维数组(m*n)分配空间,代码可以写成下面: char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof ...
 - C++ define与const
			
C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常 ...
 - Dom对象总结介绍&事件介绍&增删查找标签
			
1.dom有5个属性,属性内容如下 下面开始介绍Dom属性,一共有5个属性 1.document object:文档对象 2.element object:标签对象 3.test object:文本对 ...
 - [leetcode]29. Divide Two Integers 两整数相除
			
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
 - dede数据库内容替换,去掉文章内容中的img标签
			
1.织梦已经给我们准备好了数据库内容替换工具,在采集->批量维护->数据库内容替换 2.织梦的文章内容一般在放在dede_addonarticle表body字段中. (1).选择好数据表和 ...
 - 删除SVN版本控制目录
			
@echo On @Rem 删除SVN版本控制目录 @PROMPT [Com] @for /r . %%a in (.) do @if exist "%%a\.svn" rd /s ...
 - Linux下使用openssl生成证书
			
利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件. 参考:http:// ...
 - 开启多个tomcat 注意
			
1. 将tomcat 复制到另一个文件夹 2. 更改 tomcat 文件夹中 conf/ server.xml 文件 .共3个地方. 1. shutdown 的port 2. connector ...
 - 2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)
			
传送门 01trie经典题目. 我们可以通过计算每个数作为次小值时对答案的贡献. 显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[ ...
 - 2018.06.29 NOIP模拟 Minimum(最小生成树)
			
Minimum 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一幅由 n 个点 m 条边构成的无向带权图. 其中有些点是黑点,另外点是白点. 现在每个白点都要与他距离最近的所有黑 ...