web2py:如何在验证时更新表单字段值

0 投票
1 回答
1932 浏览
提问于 2025-05-10 15:39

我有一个示例,跟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)

撰写回答