我有一個樣品看起來挺像一個在web2py的-文檔:的web2py:如何更新表單字段值onvalidation
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:如果記錄不存在,它將被INSERT,如果它已經存在,它將被更新。 (web2py的魔法)。
這工作得很好(C的數據庫值設置爲NULL,如果「B」是假的),但這裏是漁獲:
- 檢查「B」(場「C」顯示)並在'c'中輸入一個值並提交表單。 (在數據庫中b = True和c = $值) - >很好。
- 表單再次以'c' - > Fine再次顯示爲已檢查'b'和$值。
- 取消選中'b'(字段'c'將隱藏)並提交表單。 (b = False和c = Null在數據庫中(因爲onvalidation = my_form_processing)) - >也很好!
- 表單再次顯示爲未選中'b',但如果再次選中'b'字段'c'仍然有$值(而不是空字段)。
如何清除字段'c'的表單值? (如果我只是在'b'爲False時重新加載頁面,'c'將是一個空字段。只有在提交時纔會出現此問題)。
有人可以幫助我嗎?
檢查我的示例代碼和我真正的代碼後,我只是想出了_redirect(URL( ))_線一直都在失蹤。現在它可以工作。感謝大家! – dpat