modelform使用

来源:10-4 修改密码和修改头像1

weixin_慕斯卡4281563

2019-04-29

用户修改头像时要在modelform 中传入instance=request.user否则无法成功修改头像。

image_form = UploadImageForm(request.POST, request.FILES, instance=request.user) 

而用户咨询的时候modelform中只要传入request.POST即可以了。

userask_form = UserAskForm(request.POST)

是不是因为form如果是文件的上传 就必须传入instance啊?


其实在10-7 节老师讲用户个人信息的修改的时候明确说了instance的问题,第二遍看到这里了,才对此有了认识,第一遍的时候没有体会到。

今天在我的代码中体会到了instance在modelform存储中的作用,真是用到了体会才是真切啊!! 同样一段代码在两种情况下:
1.没有传入instance

            user_reserve_form = UserEquipmentForm(
                   {'user': user, 'borrow_time': borrow_time, 'plan_to_return_time': plan_to_return_time, 'return_time': return_time,'equipment': equipment})
                   

效果是这样
图片描述

2.传入instance参数

            user_reserve_form = UserEquipmentForm(
                   {'user': user, 'borrow_time': borrow_time, 'plan_to_return_time': plan_to_return_time, 'return_time': return_time,'equipment': equipment},
                    instance=UserEquipment.objects.get(borrow_time__icontains=borrow_time)
                                                 )

效果如下
图片描述

其实老师在课程里都讲过这些内容,只有自己做的时候才能真的体会到,无论老师强调“这里很关键”多少遍,自己不做是体会不到的这些技巧。
3. 这里还体会到一个技巧(老师课程中也讲到过)
字段名__icontains
borrow_time__icontains,我发现有6位微妙的datetime经过template传到view中后就没有了只剩下 年月日时分秒,而数据库中的borrow_time是 年月日时分秒微妙,那么如果borrow_time=borrow_time这样查的话永远找不到那条记录的,我这里折腾了好久,刚开始一定要template把6位的微妙给我传到view这样就简单了,实在没有找到办法,最后想到了老师提到过用“__contains”就是说只匹配到秒,这样也可以找出那条记录,当然了最好是能把微妙信息包括进去这样就绝对保证找到条目的唯一性了。

写回答

1回答

Ethreal

2019-04-29

如果有instance参数就修改数据库中的记录,如果没有instance参数就在数据库中添加新的一条记录,这是modelform的,详细可以看官方文档对比源码去观察理解下

0
3
bobby
回复
weixin_慕斯卡4281563
是的,有些细节虽然第一次看用起来能成功,实际上要多看几次就能知道很多细节了
2019-05-02
共3条回复

Python3.6+django+xadmin,打造在线教育平台

【毕设】Python 2.7到3.6 完美适配,Django升级2.0

3677 学习 · 4038 问题

查看课程