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

2024-05-14 18:45:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很像web2py文档中的示例:

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

模型/数据库:

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

控制器/默认.py:

^{pr2}$

但又增加了一些“魔力”:

  • 在我的原始代码中,表单要求您登录,并始终使用用户\ id==auth_id加载记录。为了简化操作,总是加载user_id==1的记录。在
  • 如果未选中复选框“b”,则隐藏字段“c”(请参见:Conditional fields
  • 如果未选中复选框“b”,并且表单已提交,请清除值“c”(请参见:onvalidation
  • FTR:如果记录不存在,它将被插入;如果它已经存在,它将被更新。(web2py魔术)。在

这很好地工作(如果'b'为false,则c的数据库值设置为NULL),但下面是一个要点:

  • 选中“b”(显示字段“c”)并在“c”中输入值并提交表单。(b=真,c=数据库中的$值)->好。在
  • 表单再次显示,选中“b”和“c”中的$value—>;再次显示。在
  • 取消选中“b”(字段“c”将隐藏)并提交表单。(数据库中b=False,c=Null(因为onvalidation=my\u form\u processing)—>;也可以!在
  • 表单再次显示,只有未选中的“b”,但如果再次选中“b”,则字段“c”中仍有$value(而不是空字段)。在

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

有人能帮我吗?在


Tags: authid数据库false表单fielddb记录
1条回答
网友
1楼 · 发布于 2024-05-14 18:45:34

如果您的目标是简单地有条件地删除该变量,一种方法是:

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)

相关问题 更多 >

    热门问题