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回答
同学你好:
save方法是父类ModelForm中定义的方法,该方法的作用就是可以保存表单对象(表单类对应着模型类)到数据库。一般使用时我们会对该方法进行重写,设置我们要保存对象的代码逻辑。
定义该方法后,在view中使用表单调用该方法即可对该对象进行操作并保存到数据库。
如果我解决了同学的问题,请采纳!学习愉快^_^。
相似问题