Month: 八月 2017

莫莫十六个月

七月下旬外公外婆来杭州,替爷爷奶奶。爷爷在这的后半个月跟爷爷玩的挺好了,偶时有意识叫 diadia(方言里的 爷爷)。叫奶奶也会主动叫,更多是饿了或急了会 nainainainai 的不停喊

下方两颗槽牙终于出来了,早晚刷牙又多了一块需要照顾的区域。更多的牙还没冒,不过应该也还是在暗暗的长,不然也不会又开始喜欢咬人了

天气太热,之前爷爷在这边的时候早上带莫莫出去溜达,白天就只能窝室内了,傍晚吃过晚饭再出去转转。小区外万科开了个面向小朋友的学习中心,最小从十八个月开始接受,刚开的时候也允许别的小朋友进去玩,地方够大儿童保护措施也到位,加上还有超多玩具,莫莫爱死了这个地方,去了都不想回来。不过这个学习中心从一开始可以随便进变只有周一周二白天对非报名小朋友开放,再到只对报名上课的小朋友在上课时开放,甚是可惜

出去喜欢跟各种大哥哥大姐姐玩,在学习中心时有过十岁左右的姐姐带着玩,可高兴了。对面小区有比较大的喷泉,也喜欢要过去看,而且自己能记住地方,会手指方向带路

爷爷奶奶回去前有一天早上在小区里碰到绿化浇花,水管漏水在那玩了好一会,应该就这次搞着凉了,又感冒流鼻涕好几天,还好没发烧,等好差不多时去游了一次泳,又反复了,等外公外婆过来快一周才彻底好掉

感冒期间没去游泳,断了快两周,后面好了过去意外收获是现在游泳也开始高兴的扑腾踢腿,在游泳馆洗澡也能老实配合

家里人总觉得拉拉裤有点紧,换的时候都看勒出印来,但是现在还不到十公斤,用 9-14 的 L 号应该是刚好的才对,还特意去大杨杨哥哥家去借了个 XL 的试,明显吊下去了,而且换的时候一样有印,应该拉拉裤就是这样吧,可能穿的时候还要再靠上一点遮住肚脐,这样大腿根部也还好没那么勒

餐椅参考别人家把整个垫子都撤掉,直接坐塑料的底座上,似乎就没有那么热,稍微好接受一点,不那么热的时候可以坐着吃完,但也经常吃着吃着拉臭或热了就要下来

外婆来了后看莫莫尿尿或臭臭时其实是有挺明显的征兆,莫莫自己经常也有主动意识提前动作,就想训练自助排便,不过爸爸还是觉得没必要这么早开始训练,让小朋友到了年纪自然就会了。鉴于没必要为一些可有可无的事情过多争执,还是买了个小马桶,但是马桶买回家后莫莫也不喜欢坐,并没有像外婆想要的那样,最后也还是尿不湿正常换了

大动作越来越多,会高兴的左右跳脚,会转圈,经常都担心他转晕了,还想双脚跳不过还跳不起来。爬上爬下更流畅,从床上一滑就下来了,自己的床周围有围栏也可以借力爬上去,沙发更是毫无挑战性,放阳台边的摇椅也可以自己爬上爬下想要摇着玩。偶尔想爬电视柜,但更多的是把一只脚搭柜子中间做压腿一样的动作

618 时在京东买了个便携式的 DVD 播放器,像个小笔记本电脑,打算给他看巧虎一岁后每个月给的 DVD 碟片。看过后就收不住了,只要看到播放器就想要看,自己还老想着要去换碟,要按开抠出来,或者有模有样的非得自己放自己手里的进去。电视也偶尔给看看动画片。不过整体都还是没给多看,一天看一两回,每次不超过十分钟,保护眼睛,同时也给他一些不一样的信息输入

爱看书,妈妈买的一些习惯绘本和故事书都翻烂了好几本,放客厅的书看腻了还要自己踮脚去书架上去拿。好些故事感觉他都记住了,因为讲前面他能模仿出后面的动作,虽然经常看到前几页就跑了,可能是已经记住的就没那么大兴趣?书和画册上的好多动物水果什么的都认识,问他什么在哪里,能准确点出来,或者还会去找出来别的什么书上有翻给你看

相对于动作和识物进度的超前,对数字、形状和颜色就不那么敏感,跟他讲的时候兴趣没那么大,问的时候也有一搭没一搭。语言能力也是正常进度,总喜欢粘着爸爸不停的叫爸爸,爸爸答应了还要继续喊下去,其他的偶有意两个单字冒出来,除了叫爸妈发音最好的还是「不要」,字正腔圆表意清楚,比如想让他坐餐椅但是他又不要坐时,抱着他会一边挣扎一边说「不要,不要」

好几个月前在围栏里爸爸有做前滚翻给莫莫看,现在莫莫就老想自己学,大家都担心他那个直角头撑地的姿势容易扭到脖子,爸爸也没再做这个动作以免他模仿,但架不住小朋友自己还是学会了,只是前滚翻变成了侧滚,自己会了后超开心的跑房间里把爸爸拉到客厅的垫子上看他是怎么翻的

爸爸平时有把两个手放鼻子前扭成大象鼻子逗莫莫玩,也很快被学去,说大象的时候莫莫会自己把两个手学爸爸放,表示这是大象。另外教的一个动作是兔兔,把手举到头上学兔兔长耳朵,学会了但是不太像,更像是抱头,但这个动作是表示兔兔是明白无误的。后面还想教小花猫有胡须,这个似乎就还没太理解和模仿到位,也许手在嘴边横着走这个动作对小朋友来说并不那么自然?

有明确的自我意识,问谁是莫莫会指自己,有时候扮可爱还会戳戳自己的脸,让人萌化。不过叫他「莫莫」的时候还是不答应,哪怕同时他叫爸爸或妈妈我们有不停的每次都答应

穿脱衣服能很好的配合。说要脱衣服就能手举起来再缩下去好让脱袖子,说脱裤子也能扶着站好两个脚轮流抬起让脱裤腿。穿衣服时脑袋套上去后如果担心卡住他还没扯到脖子,会直接自己上手帮扯下来,头套好后就知道左右手轮流举起来穿袖子,穿裤子也能两个脚轮流让套进去。到小区游乐场想去玩沙子,说要脱鞋哦,立马自己乖乖的先在沙池外面蹲下来手去摸鞋子,虽然还没法自主穿脱,但是意思都是到位了的

外婆说胆子比以前小了,事情是被小区门口便利店的老板娘说乱翻货架上的奶片糖要打手,后面就不敢去便利店了。不过爸爸看来这个应该是胆大和守规矩之间的平衡,小朋友确实也不能胡作非为想怎样就怎样,约定好规矩并遵守是有必要的。在家守规矩的典型就是现在说好阳台、厨房、洗手间不进去,就能乖乖站门口等,这样也放心挺多。出去的时候带着玩的人也主动限制一些可能让其他人不高兴的动作,也不容易麻烦和影响别人,不当熊孩子熊家长

体重涨了点到 9.5kg,身高没量,但从他各种踮脚够的东西越来越多范围越来越大看,似乎也是长高了的

既然是爸爸在记录,最后加一点私货。外婆刚来的时候莫莫还是有点点不适应,毕竟又隔了好久没在一起,晚上喂奶哄睡都不要外婆,得爸爸或妈妈才行。早上起床有时候有点起床气或没看到熟悉的人会哭闹下,但看到爸爸过来就能很高兴的「爸爸,爸爸」的叫,早上都经常是爸爸来换衣服换尿不湿,再抱去洗脸洗手,超配合超亲密。早上爸爸去上班了跟爸爸挥挥手飞吻一个,或干脆跑过来抱一下,一天都超开心,哈哈

wtforms 的 StringField 里设置 default 无效

在项目里使用 wtforms,设置了一个带默认值的 StringField,但提交表单如果没有这项或值是空的,则返回为空,并不会使用 default 里的值

例如定义如下表单

def ListForm(Form):
    status = StringField("status", validators=[Optional()], default="all")

提交一个空请求,返回的 status 是空而不是 all。去跟代码并看了下 GitHub 上的 issue 讨论,按 wtforms 官方的说法,这是故意设计成这样的,参考如下内容

大意是,如果用户设置了一个 Field,那么他就应该有值,不然我们就强行设置为空

但是这个逻辑狗屁不通,因为除了 StringField 其他的类型域就没这个问题,比如 IntegerField 就是可以这么用而且能返回正确的 default

def ListForm(Form):
    status = StringField("status", validators=[Optional()], default="all")
    x = IntegerField("x", validators=[Optional()], default=9)

没办法自己新增了一个 StringFieldWithDefault 的类来解决这个问题(被覆盖的代码可以看上面 GitHub Issue 里的讨论)

class StringFieldWithDefault(StringField):
    def process_formdata(self, valuelist):
        if valuelist:
            self.data = valuelist[0]
        else:
            self.data = self.object_data

而且 wtforms 的数据校验也是谜一般的逻辑,比如设置如下

def ListForm(Form):
    status = StringField("status", validators=[Optional(), AnyOf(["all", "visible"])], default="all")
    x = IntegerField("x", validators=[DataRequired()])

这里会出现两个问题

一是 Optional 如果发现没有值或空,是能通过这个校验的,这里逻辑也没错,但是特喵的 Optional 如果遇到值为空的时候,会把之前的所有错误都清空,并且停止检查后面的 validator。这个迷一般的逻辑会导致如果传的空字段,即没有按正常人预期的拿到 default,也没有去执行 AnyOf 的校验,而是直接通过了。这个官方无解,也不打算修,只说在 3.x 的时候考虑加配置参数,不过看进度上一个版本已经是 2015 年发布的 2.1,而且 GitHub 仓库并不活跃,那么只能呵呵呵呵,然后换自己的 StringFieldWithDefault 吧

二是 DataRequired 不是检查 if field.name in formdata,而是检查 if field.data,这就意味着,如果传了一个 0 的整型参数给 IntegerField,是通不过 DataRequired 的验证的,同理还有空字符串。这个可以改用 InputRequired 来解决,还算是官方给了条活路