wtforms+flask_sqlalchemy在flask-admin视图下实现日期的修改与更新
背景:
在flask-admin 的modelview视图下实现自定义视图的表单修改/编辑是件不太那么容易的事情,特别是想不自定义前端view的情况下。
材料:
wtforms+flask_sqlalchemy
制作:
上代码
1、模型代码
from .exts import db
from flask_login import UserMixin
from datetime import datetimeclass AiConfig(db.Model, UserMixin):__tablename__ = 'ai_config'id = db.Column(db.Integer, primary_key=True, autoincrement=True)created_at = db.Column(db.TIMESTAMP, default=datetime.utcnow)updated_at = db.Column(db.TIMESTAMP, default=datetime.utcnow)status = db.Column(db.Integer)ai_name = db.Column(db.String(128))
注:默认日期函数可以采用 default=datetime.utcnow 来实现
2、视图测代码
a、AiConfigForm 表单
class AiConfigForm(form.Form):def get_countries():return Organ.query.order_by('updated_at').all()ai_name = fields.StringField('AI名称', validators=[validators.DataRequired()])ai_code = fields.StringField('AI编号', validators=[validators.DataRequired()])ai_extends = fields.TextAreaField('配置扩展', widget=TextArea())root_url = fields.URLField('根URL', validators=[validators.DataRequired()], widget=URLInput())organ = QuerySelectField('机构名称', validators=[validators.DataRequired()], query_factory=get_countries, get_label='org_name') description = fields.TextAreaField('描述', widget=TextArea())status = fields.SelectField('状态', choices=[(1, '有效'), (0, '无效')], default=0)
b、modeview视图下实现表单新增
@expose('/new/', methods=('GET', 'POST'))def create_view(self):bean = AiConfig()bean.updated_at = datetime.today()form = AiConfigForm(request.form, obj=bean)if self.validate_form(form):model = self.create_model(form)if model:flash(gettext('Record was successfully created.'), 'success')return redirect(self.get_save_return_url(model, is_created=True))if self.create_modal and request.args.get('modal'):template = self.create_modal_templateelse:template = self.create_templatereturn self.render(template, form=form)
注:上面代码片段中这样修改update_at 是不生效的,目前尚未找到在这个代码交互中修改表单AiConfigForm 中并未定义字段update_at 属性的方法 (因为属性赋值是在其self.create_model()内置函数中实现的)
c、modelview 视图下实现表单修改
@expose('/edit/', methods=('GET', 'POST'))def edit_view(self):id = request.args['id']return_url = request.values.get('url') or self.get_url('.index_view')model = self.get_one(id)if model is None:flash(gettext('Record does not exist.'), 'error')return redirect(return_url)form = AiConfigForm(request.form, obj=model)if self.validate_form(form):model.updated_at = datetime.today()if self.update_model(form, model):flash(gettext('Record was successfully saved.'), 'success')# save buttonreturn redirect(self.get_save_return_url(model, is_created=False)) if request.method == 'GET' or form.errors:self.on_form_prefill(form, id)if self.edit_modal and request.args.get('modal'):template = self.edit_modal_templateelse:template = self.edit_templatereturn self.render(template, form=form)
注:上述代码片段中 model.updated_at = datetime.today() 是有效的,因为在self.update_model(form,model) 内置函数中只是将form 中表单数据通过 form.populate_obj(model) 值cp 的方式简单覆盖来实现,我们只需要在调用该方法前将model 进行修改便可生效。
效果
1、编辑/新增 view中不存在日期2

2、数据库中存在日期

3、列表中该记录存在日期

注:这就充分说明通过上述逻辑实现了新增日期和修改日期的后台修改
疑问与经验
疑问
1、为啥不在AiConfigForm 表单中通过影藏字段来实现日期呢?
该方案有尝试,但是不行,因为数据库属性是日期类型的,实体中该字段也是日期类型,如果只是在表单中采用影藏字段,新增时非常好用,只需要通过form.updated_at.data=datetime.today()实现赋值,但编辑时就会因为模型字段与表单中针对updated_at 字段的类型定义不一致导致无法通过populate_obj 函数进行模型值赋值导致报异常,同时由于此刻表单中并没有updated_at这样的日期类型字段,有的只是影藏字段,故无法form.updated_at.data=datetime.today() 实现赋值。当然如果不怕麻烦可以写2个form 视图就可以友好结果上述问题。
2、为啥不直接自定义view模板呢?
当然可以,只是因为懒。
3、为啥不建2个AiConfigForm 视图,一个用于编辑一个用于新增?
当然可以,而且可以做到很优雅,只是懒
经验
1、在ModelView 的子视图中重写部分方法,如@expose('/new/', methods=('GET', 'POST'))和@expose('/edit/', methods=('GET', 'POST')),中如果采用wtforms 自定义表单,但又不想自定义表单视图,那么只需要简单的通过form = AiConfigForm(request.form, obj=bean) 方法在上面新增、编辑函数中使用wtforms 表单。但这里要说明的是AiConfigForm(request.form, obj=bean) 中的 obj 对象接收的是模型,通过把模型赋值给obj 的方式实现已有数据的回填,该方案在编辑中非常有用
相关文章:
wtforms+flask_sqlalchemy在flask-admin视图下实现日期的修改与更新
背景: 在flask-admin 的modelview视图下实现自定义视图的表单修改/编辑是件不太那么容易的事情,特别是想不自定义前端view的情况下。 材料: wtformsflask_sqlalchemy 制作: 上代码 1、模型代码 from .exts import db from …...
AI的进阶之路:从机器学习到深度学习的演变(三)
(承接上集:AI的进阶之路:从机器学习到深度学习的演变(二)) 四、深度学习(DL):机器学习的革命性突破 深度学习(DL)作为机器学习的一个重要分支&am…...
thinkphp 多选框
视图 <div class"form-group"><label for"c-flag" class"control-label col-xs-12 col-sm-2 col-md-4">{:__(Flag)}</label><div class"col-xs-12 col-sm-8 col-md-8"><!--formatter:off--><select …...
机器学习《西瓜书》学习笔记《待续》
如果说,计算机科学是研究关于“算法”的学问,那么机器学习就是研究关于“学习算法”的学问。 目录 绪论引言基本术语 扩展向量的张成-span使用Markdown语法编写数学公式希腊字母的LaTex语法插入一些数学的结构插入定界符插入一些可变大小的符号插入一些函…...
STM32HAL I2C函数
8.5 使用IIC协议读写EEPROM 硬件方式实现 (HAL库) **HAL_I2C_Mem_Write() :这种方法可以写1个或者多个字节 ** /*** brief 以阻塞模式向指定的内存地址写入数据* param hi2c 指向 I2C_HandleTypeDef 结构体的指针,包含指定 I2C 的配置信息…...
洛谷 P1644 跳马问题 C语言
题目: P1644 跳马问题 - 洛谷 | 计算机科学教育新生态 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 所示。马自左下角 (0,0) 向右上角 (m,n) 跳。规定只能往右跳,不准往左跳。比…...
每天40分玩转Django:实操在线商城
实操在线商城 一、今日学习内容概述 模块重要程度主要内容商品模型⭐⭐⭐⭐⭐商品信息、分类管理购物车系统⭐⭐⭐⭐⭐购物车功能实现订单系统⭐⭐⭐⭐⭐订单处理、支付集成用户中心⭐⭐⭐⭐订单管理、个人信息 二、模型设计 # models.py from django.db import models fro…...
Bug解决!ImportError: cannot import name MutableMapping from collections
省流:python版本更新 而一些生态库的变量命名没更新变化导致的问题 起因是在win环境下装spark 但是发现这是python底层的问题 于是想写一篇这个错误的博客警戒世人 py实在是太多生态库了 但并不是所有的都维护的很好 大概可以理解成 python原先有个东西叫col…...
【Rust自学】4.5. 切片(Slice)
4.5.0. 写在正文之前 这是第四章的最后一篇文章了,在这里也顺便对这章做一个总结: 所有权、借用和切片的概念确保 Rust 程序在编译时的内存安全。 Rust语言让程序员能够以与其他系统编程语言相同的方式控制内存使用情况,但是当数据所有者超…...
医学图像 三维重建,原图与灰度图叠加,原图与多图叠加显示;多图像融合显示,彩色灰度图像融合
Part1: Summary 我们在做图像分割或融合时,有时需要显示多份数据进行叠加显示;可能需要这种效果: 四视图: 基于这个,我看一下网上的实现总结了一下;实现了以下几种效果: Part2:多种…...
递归实现指数型枚举(递归)
92. 递归实现指数型枚举 - AcWing题库 每个数有选和不选两种情况 我们把每个数看成每层,可以画出一个递归搜索树 叶子节点就是我们的答案 很容易写出每dfs函数 dfs传入一个u表示层数 当层数大于我们n时,去判断每个数字的选择情况,输出被选…...
Unity实现Root Motion动画的Navigation自动导航
Root motion动画可以将角色的根节点(通常是角色的骨盆或脚部)的运动直接应用到游戏对象上,从而实现角色的自然移动和旋转,避免出现脚底打滑的现象。采用Root motion动画的游戏对象,通常是重载了onAnimatorMove函数&…...
[react]不能将类型“string | undefined”分配给类型“To”。 不能将类型“undefined”分配给类型“To”
场景, 封装组件的时候, 想通过外部传进去一个路由地址, 再用<Link to{}>跳转, 显示这个, 有四种方法解决 第一种 合并运算符 ?? ?? 是 空值合并运算符(Nullish Coalescing Operator),它是 JavaScript 和 TypeScript 中的一种逻辑…...
python实现基于RPC协议的接口自动化测试
01 什么是RPC RPC(Remote Procedure Call)远程过程调用协议是一个用于建立适当框架的协议。从本质上讲,它使一台机器上的程序能够调用另一台机器上的子程序,而不会意识到它是远程的。 RPC 是一种软件通信协议,一个程…...
如何使用PSQL Tool还原pg数据库(sql格式)
新建一个数据库用来还原;选择新建的数据库,右键选择【PSQL Tool】,打开PSQL Tool命令行界面;赋予pg库对sql文件的执行权限,否则会报“Permission denied”的错误,命令如下: chmod urwx D://NoS…...
uni-app商品搜索页面
目录 一:功能概述 二:功能实现 一:功能概述 商品搜索页面,可以根据商品品牌,商品分类,商品价格等信息实现商品搜索和列表展示。 二:功能实现 1:商品搜索数据 <view class="search-map padding-main bg-base"> <view class…...
【深度学习】零基础介绍循环神经网络(RNN)
RNN介绍 零基础介绍语言处理技术基本介绍分词算法词法分析工具文本分类与聚类情感分析 自然语言处理词向量词向量学习模型1. 神经网络语言模型2. CBOW 和 skip-gram3. 层次化softmax方法4. 负采样方法 RNN介绍RNN的变种:LSTM1. Forget Gate2. Input Gate3. Update M…...
青少年编程与数学 02-004 Go语言Web编程 13课题、模板引擎
青少年编程与数学 02-004 Go语言Web编程 13课题、模板引擎 一、模板引擎模板引擎的主要特点包括:模板引擎的应用场景:Go语言中的模板引擎:示例:使用Go的html/template包 二、工作流程1. 创建模板文件2. 准备数据3. 加载模板4. 渲染…...
如何优雅的关闭GoWeb服务器
以下内容均为Let’s Go Further内容节选以及作者本人理解。 这里创建了一个后台进程用于捕获关闭信号,在后台进程中,主要内容为: 创建一个缓冲通道 quit使用signal.Notify函数监听并捕获关机信号SIGINT,SIGTERM,在捕获关机信号后…...
AI程序员,开源的Devin,OpenHands 如何使用HuggingFace Inference API
我用了一下,界面这样子: Github:https://github.com/All-Hands-AI/OpenHands OpenHands 如何使用HuggingFace Inference API huggingface/meta-llama/Llama-3.3-70B-Instruct 而不是 meta-llama/Llama-3.3-70B-Instruct 不要设置base URL&…...
SEO_SEO数据监控与分析的关键指标介绍
SEO数据监控与分析的关键指标介绍 在当今数字营销的世界里,SEO(搜索引擎优化)已经成为了每个网站运营者和数字营销人员必不可少的技能。SEO数据监控与分析是SEO工作的重要环节,通过对关键指标的监控和分析,我们可以更好…...
重构PDF知识管理:Obsidian PDF++让文献处理效率提升300%的实战指南
重构PDF知识管理:Obsidian PDF让文献处理效率提升300%的实战指南 【免费下载链接】obsidian-pdf-plus PDF: the most Obsidian-native PDF annotation & viewing tool ever. Comes with optional Vim keybindings. 项目地址: https://gitcode.com/gh_mirrors/…...
BGE-Reranker-v2-m3为何必须用?RAG幻觉过滤入门必看
BGE-Reranker-v2-m3为何必须用?RAG幻觉过滤入门必看 如果你正在搭建RAG系统,或者已经搭建了但总觉得回答质量时好时坏,经常出现“幻觉”——也就是模型一本正经地胡说八道——那你很可能遇到了一个核心问题:向量检索“搜不准”。…...
Qwen3.5-2B入门指南:如何将本地7860服务映射为公网可访问API接口
Qwen3.5-2B入门指南:如何将本地7860服务映射为公网可访问API接口 1. 引言 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型,属于Qwen3.5系列的小参数版本(20亿参数)。这个模型主打低功耗、低门槛部署,特别适合在端侧和…...
别再手写表单了!用Vue3+AI做个自己的低代码设计器,5分钟搞定一个页面
用Vue3AI打造个人专属低代码表单设计器:5分钟解放重复劳动 如果你是一名中后台开发者,每天被各种CRUD表单折磨得焦头烂额,这篇文章就是为你准备的。想象一下:当你接到第100个类似的用户管理表单需求时,不再需要从零开始…...
实战指南:基于快马平台与Touchgal,从零开发移动端手写绘图应用
今天想和大家分享一个实战项目:基于Touchgal开发移动端手写绘图应用。这个项目特别适合需要复杂手势交互的场景,比如绘图软件、地图导航等。下面我会详细介绍整个开发流程和关键实现点。 项目初始化与环境搭建 首先需要创建一个基础的HTML5项目结构。画…...
深入解析STM32 map文件:从编译到内存优化的关键步骤
1. 为什么STM32开发者必须掌握map文件分析 第一次接触STM32的map文件时,我和大多数新手一样感到一头雾水。这个由编译器自动生成的文本文件,乍看就像天书般难以理解。直到有次项目遇到内存不足的紧急情况,我才真正体会到map文件的价值——它不…...
Mermaid在线编辑器终极指南:从代码思维到专业图表的无缝转换体验
Mermaid在线编辑器终极指南:从代码思维到专业图表的无缝转换体验 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-l…...
GLM-OCR模型Node.js环境配置与API服务搭建全指南
GLM-OCR模型Node.js环境配置与API服务搭建全指南 你是不是也遇到过这样的场景?手头有一堆图片需要提取文字,比如扫描的文档、截图或者手机拍的照片。自己手动录入?效率太低。用现成的在线OCR工具?又担心数据安全和调用限制。特别…...
springboot+vue基于web的美食外卖点餐平台的设外卖员商家
目录同行可拿货,招校园代理 ,本人源头供货商外卖员功能分析商家功能分析技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 外卖员功能分析 外卖员在美食外卖点餐平台中的核心…...
