web2py:如何更新表单字段值onvalidation

时间:2015-11-19 15:01:14

标签: python web2py

我有一个看起来很像web2py-docs中的样本:

http://web2py.com/books/default/chapter/29/07/forms-and-validators#onvalidation

模型/ 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

控制器/ 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”(请参阅​​:Conditional fields
  • 如果未选中复选框“b”且表单已提交,请清除值“c”(请参阅​​:onvalidation
  • FTR:如果记录不存在,它将被INSERTed,如果它已经存在,它将被UPDATEd。 (web2py的魔法)。

这很有效(如果'b'为false,则c的数据库值设置为NULL)但这里是catch:

  • 选中'b'(显示字段'c')并在'c'中输入值并提交表单。 (b = True,c =数据库中的$ value) - >细。
  • 表格再次显示,选中'b','c'中的$值 - >好了。
  • 取消选中“b”(字段“c”将隐藏)并提交表单。 (b = False,c =数据库中的Null(因为 onvalidation = my_form_processing )) - >太好了!
  • 表单再次显示为未选中的'b',但如果再次检查'b'字段'c'仍然有$ value(而不是空字段)。

如何清除字段'c'的表单值? (如果我只是在'b'为False时重新加载页面,'c'将是一个空字段。此问题仅在提交时出现。)

有人可以帮我吗?

1 个答案:

答案 0 :(得分: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)