首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

何时使用Django的save方法和save

什么时候使用save(commit=False)方法,save_m2m方法以及如何使用是Django表单forms进阶必需了解的知识。我们今天就带你来看一看。

何时使用save(commit=False)方法

Stackoverflow上其实已经有了一段非常精炼的答案。英文原文如下,我把它翻译了一下:

That's useful when you get most of your model data from a form, but need to populate somefields with non-form data. Saving with commit=False gets you a model object, then you can add your extra data and save it.

当你通过表单获取你的模型数据,但是需要给模型里null=False字段添加一些非表单的数据,该方法会非常有用。如果你指定commit=False,那么save方法不会理解将表单数据存储到数据库,而是给你返回一个当前对象。这时你可以添加表单以外的额外数据,再一起存储。

save(commit=False)方法实际应用案例

下面我们来看一个实际应用案例。我们创建了一个叫文章Article的模型,里面包含title, body和作者author等多个字段,其中author字段非空null=False。我们由Article模型创建了一个ArticleForm表单,可以让用户发表新文章,但是我们故意把author字段除外了,因为我们不希望用户编辑作者。

最后用户提交的表单数据里肯定没有author,当这样的数据提交到数据库时肯定会有问题的。所以我们先通过article = form.save(commit=False)创建article实例,此时让Django先不要发送数据到数据库,等待我们把author添加好后,再把数据一起存储到数据库中。

下面是视图文件views.py的代码。最重要的是ArticleForm构成和article_create方法。

from.modelsimportArticle

fromdjango.formsimportModelForm

fromdjango.httpimportHttpResponseRedirect

fromdjango.shortcutsimportrender

classArticleForm(ModelForm):

classMeta:

model = Article

exclude = ['author']

defarticle_create(request):

ifrequest.method =='POST':

form = ArticleForm(request.POST)

ifform.is_valid():

article = form.save(commit=False)

# commit=False告诉Django先不提交到数据库.

article.author = request.user# 添加额外数据

article.save()# 发送到数据库

returnHttpResponseRedirect("/blog/")

else:

form = ArticleForm()

returnrender(request,'blog/article_create_form.html',{'form': form})

如果你使用Django自带的基于类的视图(CBV), 你可以使用form_valid方法完成上述同样的操作。具体代码如下。

fromdjango.views.generic.editimportCreateView

from.modelsimportArticle

fromdjango.formsimportModelForm

# Create your views here.

classArticleForm(ModelForm):

classMeta:

model = Article

exclude = ['author']

classArticleCreateView(CreateView):

model = Article

form_class = ArticleForm

template_name ='blog/article_create_form.html'

# Associate form.instance.user with self.request.user

defform_valid(self,form):

form.instance.author =self.request.user

returnsuper().form_valid(form)

何时使用save_m2m方法及如何使用

save_m2m方法只用来存储多对多的关系。当你同时满足下面两个条件时,你需要使用此方法。如果你直接使用save()或form_valid()方法,是可以直接存储多对多(m2m)关系的,不需要用save_m2m。

你使用了save(commit=False)方法

你的model里有多对多的关系(比如tags)

假设我们文章模型里有tags这个多对多的字段,我们的article_create方法需要增加一行。

defarticle_create(request):

ifrequest.method =='POST':

form = ArticleForm(request.POST)

ifform.is_valid():

article = form.save(commit=False)

# commit=False tells Django that "Don't send this to database yet.

article.author = request.user# Set the user object here

article.save()# Now you can send it to DB

form.save_m2m()

returnHttpResponseRedirect("/blog/")

else:

form = ArticleForm()

returnrender(request,'blog/article_create_form.html',{'form': form})

欲获取更多Python与Django Web开发实战与教程,请积极关注我们微信公众号。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180530G0AOEE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券