web2py:如何在验证时更新表单字段值
我有一个示例,跟web2py文档里的很像:
http://web2py.com/books/default/chapter/29/07/forms-and-validators#onvalidation
模型文件:models/db.py:
db.define_table('numbers',
# Field('user_id', 'reference auth_user'),
Field('user_id', 'integer'),
Field('b', 'boolean'),
Field('c', 'integer')
# db.numbers.user_id.requires = IS_IN_DB(db, db.auth_user.id)
db.numbers.user_id.writable = db.numbers.user_id.readable = False
db.numbers.id.writable = db.numbers.id.readable = False
控制器文件:controllers/default.py:
def my_form_processing(form):
if not form.vars.b:
form.vars.c = None
# @auth.requires_login()
def insert_numbers():
# record = db(db.numbers.user_id==auth.user_id).select().first()
record = db(db.numbers.user_id=1).select().first()
db.numbers.c.show_if = (db.numbers.b == True)
form = SQLFORM(db.numbers, record)
if form.process(onvalidation=my_form_processing).accepted:
session.flash = 'record inserted'
redirect(URL())
return dict(form=form)
但我加了一些“魔法”:
- 在我原来的代码中,表单要求用户必须登录,并且总是加载 user_id == auth_id 的记录。为了简化,始终加载 user_id==1 的记录。
- 如果复选框 'b' 没有被选中,就隐藏字段 'c'(见:条件字段)
- 如果复选框 'b' 没有被选中并且表单被提交,清空值 'c'(见:onvalidation)
- 顺便说一下:如果记录不存在,它会被插入,如果已经存在,它会被更新。(web2py的“魔法”)
这个效果还不错(如果 'b' 是假的,数据库中 'c' 的值会被设置为 NULL),但这里有个问题:
- 选中 'b'(字段 'c' 会显示)并在 'c' 中输入一个值,然后提交表单。(b = 真,c = 数据库中的 $value) -> 好的。
- 表单再次显示,'b' 被选中,'c' 中有 $value -> 也很好。
- 取消选中 'b'(字段 'c' 会被隐藏)并提交表单。(b = 假,c = 数据库中的 Null(因为 onvalidation=my_form_processing)) -> 也没问题!
- 表单再次显示,只有 'b' 没有被选中,但如果你再次选中 'b',字段 'c' 里仍然有 $value(而不是一个空字段)。
我该如何清空字段 'c' 的表单值?(如果我在 'b' 为假时重新加载页面,'c' 会是一个空字段。这个问题只在提交时出现)。
有人能帮我解决这个问题吗?
相关文章:
- 暂无相关问题
1 个回答
0
如果你的目标只是有条件地删除那个变量,可以这样做:
def insert_numbers():
record = db(db.numbers.user_id=1).select().first()
db.numbers.c.show_if = (db.numbers.b == True)
form = SQLFORM(db.numbers, record)
if form.validate(message_onsuccess = 'record inserted'):
if not form.vars.b:
del form.vars.c
db['numbers'].insert(**form.vars)
db.commit() # just to be safe
redirect( URL(...) )
return dict(form=form)