【问题标题】:web2py: How to update form field value onvalidationweb2py:如何更新表单字段值 onvalidation
【发布时间】:2016-02-21 19:11:28
【问题描述】:

我有一个看起来很像 web2py-docs 中的示例:

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

控制器/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:如果记录不存在,它将被插入,如果它已经存在,它将被更新。 (web2py-magic)。

这很好用(如果 'b' 为假,则 c 的数据库值设置为 NULL)但这里有一个问题:

  • 选中“b”(显示“c”字段)并在“c”中输入一个值并提交表单。 (b = True and c = $value in database) -> 很好。
  • 表单再次显示,并带有选中的“b”和“c”中的 $value -> 再次正常。
  • 取消选中“b”(字段“c”将被隐藏)并提交表单。 (b = False and c = Null in database (因为 onvalidation=my_form_processing)) -> 也很好!
  • 再次显示表单时,只有未选中的“b”,但如果再次选中“b”,则“c”字段中仍有 $value(而不是空字段)。

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

有人可以帮我吗?

【问题讨论】:

  • 用我的真实代码检查我的示例代码后,我发现 redirect(URL()) 行一直丢失。现在它起作用了。谢谢大家!

标签: python web2py


【解决方案1】:

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

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)

【讨论】:

  • 嗯...从 form.process() 更改为 form.validate() 后(使用 db[]. insert) 数据库没有得到更新。我错过了什么吗?
  • @dpat - 进行了一些应该修复它的编辑。我猜是 'validate()' 中的 'next' 参数搞砸了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多