编写 HTML 表单,有 MutilpleSelect 选择框,本来也没有啥特别的,用了 Python WTForms 处理表单的 data validate,待选的数据直接默认传入 form.tags.choices = [....]
就可以了
然而上线后发现这样粗糙的方法根本招架不住,因为这个 MutilpleSelect 选择框对应选择的整个数据库的 tags 标签,而整个数据库的 tags 标签数量有几十万
这样 form.tags.choices = TagsORM.query.fetchall()
瞬间内存就爆满了
google 多方搜索,得到的也是用 Select2 (貌似 V2 这里都有用到),我仔细看过文档,发现就是采用 search 大量的数据然后将需要用的 json 数据放到页面上,但是,很多的细节,比如:
有同学在用 WTForms+Select2 的吗?能否分享一下看法?如果有更好的资料,麻烦丢个链接
谢谢!
经过一个晚上的 debug 顺利解决
表单带有默认 tags 的,那么 WTForms 直接设置 XXXForm.xxxField.default = [....]
即可,前端 select2 插件会根据你的默认 option 自动转换并显示出来
几十万的数据,mysql index 不需要优化用 %like% 查询已经很快。再大的数据我手上没有,没法测试。
Select2 这个与 WTForms 完全没有问题,也完全不相干。唯一的就是 WTForms 的 MutilpleSelect 会默认检查表单已有的 choices,不在 choices 里面就抛出 validate error,这个很简单的,只需要自己 overwrite 这个 wtforms.SelectMultipleField 的 pre_validate 为空即可
最后带个今晚的小坑,要在 MySQL 里面存 emoji 表情,记得将MySQL 全部的字符串字符集都改为 utf8mb4 并且 version > 5.5 不然的话,error throw 得你怀疑人生!
1
jugelizi 2019-02-23 16:47:19 +08:00
逻辑有问题啊 不是先放热门标签
用户输入自动匹配吗 |