Django - 边学Django边写毕业设计(day09 个人信息和修改密码)

本文介绍了Django中表单处理的细节,包括如何设置初始数据、处理disabled与readonly的区别、DateField的格式化问题以及密码修改页面的实现。在表单处理中,遇到的问题主要是生日日期显示和格式化,通过设置DateInput的format参数成功解决。在密码修改过程中,通过使用cleaned_data.get()避免了因字段验证失败导致的错误。

2021.9.30

1.个人信息完善

1.1 个人信息form表单实例知识点

  1. 首先,实例化表单的时候,要让他有初始数据,得加个**initial={}**属性。
  2. 如果修改了表单内容,没有没有在实例化的时候提供instance=要修改的模型实例,则会创建新的一条数据,如果提供了则是修改instance参数传的模型实例。
  3. CharField如果传过来是空的,在数据库中就是空字符串,而不是null了。刚好省的判断是否为null

1.2 form表单知识点

  1. 一开始我给不可修改的数据加了disabled属性,发现POST无法将disabled数据传过来,所以验证一直显示这个字段是必填的。百度之后,将不可修改数据改成readonly,就可以了。可以看出disabled与readonly的区别。
    (这算是前端知识,由于我写在form里就算是form表单知识吧,就不再分前端知识这样了,毕竟现在先把重点放在后端)
  2. DateField字段,渲染到前端type竟然是text,想要用日历选时间,将type改为date
  3. 下拉框选择的部件是Select 而不是什么什么Input
  4. 字段的Meta类,因为我不希望密码在个人信息里做修改,但其他字段可以,之前是用fields=[想要展示的字段列表]或者全部展示fields = ‘__all__’ ,现在只需要排除一个,可以用exclude = [排除的字段列表]
  5. 对生日进行校验,首先先判断这个数据是否有输入,因为无非就是两种情况,要么初始值空,要么一定有数据,所以只需要判断是否存在,如果不存在则不让他做时间的比较,否则会报错。
  6. 经过验证,生日字段type=date 传过来数据类型也是Date和当前时间datetime.time.today()类型一致,可以直接做相减,返回一个timedelta对象,**timedelta.days()**即相差多少天,今天-大于今天的肯定是负数,如果timedelta.days()<0 则抛出时间错误。

1.3 纠结了一早上的问题
就是对个人信息页面GET的时候,就算form添加了initial,给了值也是无法显示数据库已存的生日日期。
在这里插入图片描述
在console里发现了这个问题,似乎是时间格式化问题。
我看了一下渲染的HTML,有时间的value,但格式是‘YYYY/MM/DD’,好像没法在里显示出来,格式应该是要YYYY-MM-DD。
尝试过用JQuery修改,因为不熟练,没效果。
后来查文档的DateInput部件,
在这里插入图片描述
发现有个format参数可以修改格式。于是添加上,成了!
在这里插入图片描述
果然应证了那句话:你能想到的,Django都为你想好了

2.我终于可以写修改密码页面了,呜呜呜

(插一嘴,Markdown要另起有序列表,先换行,再tab,再点有序列表)

  1. 还是惯例
    ①先在work/urls.py添加一条路由
    ②再在work/views.py里加入视图函数
    ③在work/templates创建html模板
  2. 实现方式和前面的很像,不多加赘述,来讲讲遇到的问题

3.遇到的问题

  1. 表单验证时,可能会因为前面的字段没通过验证,导致后面的验证需要前面的cleaned_data的值的时候取不到值而报错。

例如:旧密码验证抛出错误,cleaned_data里就没有旧密码的值。而新密码要验证是否与旧密码一致,如果用old_pwd = self.cleaned_data[‘old_pwd’]强取,则会报错。所以为了避免强取报错,我改用
old_pwd = self.cleaned_data.get(‘old_pwd’),
这就意味着如果cleaned_data即使没有旧密码,也不会报错,而是返回None。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值