2015-11-19 66 views
0

我有一個樣品看起來挺像一個在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'將是一個空字段。只有在提交時纔會出現此問題)。

有人可以幫助我嗎?

+0

檢查我的示例代碼和我真正的代碼後,我只是想出了_redirect(URL( ))_線一直都在失蹤。現在它可以工作。感謝大家! – dpat

回答

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) 
+0

嗯...從_form.process()_更改爲_form.validate()_(使用_db []。insert_)後,數據庫沒有更新。我錯過了什麼? – dpat

+0

@dpat - 進行一些修改,以解決問題。我猜測這是'validate()'中'下一個'參數,這是搞砸了。 – Boa