django中的需要的地方: form.save(commit=False)之后需要form.save_m2m() 来保存关联信息

简介:

django中的需要的地方: form.save_m2m() 

有这样的一个场景。

举个博客的例子吧,登录之后,写博客,然后保存博客的内容。博客的有些内容是在界面上由用户填写的,有些内容是在后台添加的。例如,用户姓名之类的。同时,还会有博客所属的分类。

下面是一个Blog的model和form的定义。

 

 
  1. class Blog(models.Model): 
  2.      
  3.     LIVE_STATUS=1 
  4.     DRAFT_STATUS=2 
  5.     HIDDEN_STATUS=3 
  6.     STATUS_CHOICES=( 
  7.     (LIVE_STATUS,'Live'), 
  8.     (DRAFT_STATUS,'Draft'), 
  9.     (HIDDEN_STATUS,'Hidden'
  10.     ) 
  11.     status=models.IntegerField(choices=STATUS_CHOICES,default=LIVE_STATUS,help_text='only entries with live status will be publicly displayed'
  12.      
  13.     lives=BlogLiveManager() 
  14.     objects=models.Manager() 
  15.      
  16.     title=models.CharField(max_length=100
  17.     slug=models.CharField(max_length=100
  18.     excerpt=models.TextField() 
  19.     content=models.TextField() 
  20.     author=models.ForeignKey(User) 
  21.     categories=models.ManyToManyField(Category) 
  22.     tags=models.ManyToManyField(Tag) 
  23.      
  24.     created_at=models.DateTimeField(editable=False
  25.     updated_at=models.DateTimeField(editable=False
  26.          
  27.      
  28.     def __unicode__(self): 
  29.         return self.title 
  30.      
  31.     def save(self,*args,**kwargs): 
  32.         if not self.id: 
  33.             self.created_at=datetime.datetime.now() 
  34.         self.updated_at=datetime.datetime.now() 
  35.          
  36.         super(Blog,self).save(*args,**kwargs) 
  37.      
  38.     class Meta: 
  39.         ordering=["-updated_at"
  40.          
  41.  
  42.  
  43. class BlogForm(forms.ModelForm): 
  44.     prepopulated_fields={'slug':("title")} 
  45.      
  46.     categories = forms.ModelMultipleChoiceField( 
  47.                             queryset=Category.objects.all(), 
  48.                             widget=forms.CheckboxSelectMultiple()) 
  49.     tags=forms.ModelMultipleChoiceField( 
  50.                             queryset=Tag.objects.all(), 
  51.                             widget=forms.CheckboxSelectMultiple()) 
  52.      
  53.     class Meta: 
  54.         model=Blog 
  55.         exclude=["author"
  56.         #fields=('title','categories') 

 下面是对应的新建时候用来保存的view的代码

 

 
  1. @login_required 
 
  1. new_blog=form.save()  
def blog_new(request):      current_user=request.user      if request.method=="POST"         form=BlogForm(data=request.POST)          if form.is_valid():                            #new_blog=form.save()                            new_blog=form.save(commit=False             new_blog.author=current_user              new_blog.save()              form.save_m2m()                            return redirect('/admin/blog_list'     else         form=BlogForm()      return render_to_response('admin/blog.html'                     {'form':form,'current_user':current_user})       

 

保存blog的信息直接调用

 

 
  1. new_blog=form.save()  

就可以实现,blog的基本信息和所属分类的信息分别保存在blog表和blog_category表。但是blog的用户信息,由于没有办法从界面收集,也不能让用户选择,就应该是当前用户的信息,所以需要在代码中赋值。

这样的话就需要在form.save()方法中传递一个参数commit,赋值为False,代表不要提交到数据库。然后给blog.author赋值,然后有两种选择。

1. 一种是调用new_blog.save()保存blog的基本信息,然后在调用form.save_m2m()保存关联信息,如果不调用save_m2m()的话,就会发现关联信息没有保存,就是由于之前使用了commit=False,影响了关联信息的保存,所以这里需要调用form.save_m2m()。

2. 一种是再次调用form.save()保存blog基本信息以及关联信息。




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/794680,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
JSON 中间件 数据格式
django获取request请求头信息,获取Content-Type
django获取request请求头信息,获取Content-Type
51 4
|
2月前
|
数据库 数据安全/隐私保护 数据库管理
#099473#基于django的毕业生信息管理招聘系统
#099473#基于django的毕业生信息管理招聘系统
45 4
|
7月前
|
存储 缓存 安全
Django的会话框架提供了一种简单且安全的方式来在用户与网站之间存储和检索状态信息
【5月更文挑战第12天】Django的会话管理依赖于内置的SessionMiddleware。要启用,需在settings.py的MIDDLEWARE中包含它,并确保'django.contrib.sessions'在INSTALLED_APPS内。设置SESSION_ENGINE可选择存储引擎,如默认的数据库或缓存。在视图中,通过request.session交互会话数据。模板可以直接访问这些数据。配置包括会话超时、cookie属性和存储后端。注意,敏感数据不宜存入会话,确保会话cookie安全,考虑使用缓存降低数据库压力。
69 3
|
SQL 前端开发 JavaScript
基于python+django的旅游信息网站-旅游景点门票管理系统
该系统是基于python+django开发的旅游景点门票管理系统。是给师弟做的课程作业。大家学习过程中,遇到问题可以在github咨询作者
176 0
|
数据库 Python
django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)
django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)
|
中间件 开发工具 git
【Django | 开发】面试招聘信息网站(配置中间件记录响应耗时日志)
【Django | 开发】面试招聘信息网站(配置中间件记录响应耗时日志)
【Django | 开发】面试招聘信息网站(配置中间件记录响应耗时日志)
|
关系型数据库 MySQL 数据库
【Django | 开发】 面试招聘信息网站(为已有数据库生成管理后台)
【Django | 开发】 面试招聘信息网站(为已有数据库生成管理后台)
【Django | 开发】 面试招聘信息网站(为已有数据库生成管理后台)
|
安全 Python
【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接
【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接
【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接
|
数据库 数据安全/隐私保护 Python
【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)
【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)
【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)
|
SQL Shell 数据库
【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)
【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)
【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)