save的问题

来源:4-2 文件上传之ORM上传

xiaoyuan1

2020-02-20 20:02:06

老师,听了好几遍还是没听懂,在页面上创建了微博,需要保存不应该是在view中进行保存吗,为什么要来表单中保存

view代码

def file_upload_weibo(request):
   """发送微博带图片"""
   # 因为没有登录,默认用户来进行微博的发布
   user = WeiboUser.objects.get(pk=1)
   if request.method == 'POST':
       form = WeiboImageForm(request.POST, request.FILES)
       # form在forms.py是中WeiboImageForm类的实例化对象
       if form.is_valid():
           # 传两个参数
           obj = form.save(user, False)
           print('保存成功', obj.pk)
   else:
       form = WeiboImageForm()
   return render(request, 'file_upload_weibo.html', {
       'form': form
   })

form保存

class WeiboImageForm(forms.ModelForm):
   """微博图片上传"""
   # 在WeiboImage模型中没有微博内容的字段,现在由需要微博内容,没有办法用class Meta:的方式
   # 直接在WeiboImage模型中添加,需要这样加
   content = forms.CharField(label='微博内容', max_length=256, widget=forms.Textarea(attrs={
       'placeholder': '请输入微博内容'
   }))

   class Meta:
       model = WeiboImage
       fields = ['image']

   # 我们继承的ModelForm中又继承了BaseModelForm,在这个类中有save()方法,
   # 所以我们可以重写save方法
   # commit改为False让他不提交
   # 保存一个微博需要有用户和内容
   def save(self, user, commit=False):
       # 父类的save()是默认保存到数据库的,先不保存到数据库,先得到对象,
       # 接下来对这个对象进行修改,然后保存
       obj = super().save(commit)
       data = self.cleaned_data
       # 微博内容
       content = self.cleaned_data['content']
       # 上传图片要关联微博,微博中又有用户,所以
       # 1、创建微博的记录
       weibo = Weibo.objects.create(user=user, content=content)
       # 2、修改微博关联关系
       obj.weibo = weibo
       obj.save()
       return obj

写回答

1回答

好帮手乔木

2020-02-21

同学你好:

save方法是父类ModelForm中定义的方法,该方法的作用就是可以保存表单对象(表单类对应着模型类)到数据库。一般使用时我们会对该方法进行重写,设置我们要保存对象的代码逻辑。http://img1.sycdn.imooc.com/climg/5e4f708b093ce08206880259.jpg

定义该方法后,在view中使用表单调用该方法即可对该对象进行操作并保存到数据库。

http://img1.sycdn.imooc.com/climg/5e4f71440943824e06910357.jpg

如果我解决了同学的问题,请采纳!学习愉快^_^。

0

0 学习 · 3562 问题

查看课程