web2py记录ID未传递给SQLFORM的onvalidation函数

问题描述 投票:0回答:1

我试图通过调用不同的SQLFORMs来使用相同的控制器函数进行插入和更新,具体取决于传递给函数的参数的存在:

def manage_doc():
    db.doc_master.sr_no.readable=False
    db.doc_master.sr_no.writable=False

    if not len(request.args):
        form = SQLFORM(db.doc_master)
    else:
        doc_to_edit = db.doc_master(request.args[0])
        form = SQLFORM(db.doc_master, doc_to_edit)

    if form.process(onvalidation=check_form_manage_doc).accepted:
        if not len(request.args):
            session.flash = 'Document added'
        else:
            session.flash = 'Document updated'
        redirect(URL('index'))

    return dict(form=form)

这是onvalidation回调:

def check_form_manage_doc(form):
    new_inward_no = form.vars.inward_no
    new_inward_year = form.vars.inward_date.year
    if (form.vars.doc_date > form.vars.inward_date):
        form.errors.doc_date = 'Document Date cannot be later than Inward Date'
    rows = db(db.doc_master.inward_date.year() == new_inward_year)
    for row in rows.select():
        if ((row.id != form.vars.id) and (row.inward_no == new_inward_no)):
            form.errors.inward_no = 'Inward No %s already exists for Doc %s' % (str(new_inward_no), str(form.vars.id))
    form.vars.sr_no = str(new_inward_no)+'/'+str(new_inward_year)

虽然该函数在插入时工作正常,但在更新时它会失败,因为form.vars.id在回调函数中始终是None。我的代码出了什么问题?

controller web2py
1个回答
0
投票

form.vars.idonvalidation运行时没有填充。您可以改为使用request.post_vars.id,它当然会继续为None创建记录,但会包含更新的记录ID(request.post_vars.id将是一个字符串,所以当不是int时转换为None)。

另外,请注意,没有理由有条件地创建两种不同的形式 - 您可以简单地做:

form = SQLFORM(db.doc_master, record=request.args(0))

如果没有URL args,request.args(0)将只是None。另请注意,record参数可以只是记录ID而不是包含记录的DAL Row对象。

另请注意,.process方法包含一些可以进一步简化代码的参数 - 所有表单代码都可以替换为:

form = SQLFORM(db.doc_master, request.args(0)).process(
    onvalidation=check_form_manage_doc,
    message_onsuccess='Document %s' % ('updated' if request.args else 'added'),
    next=URL('index'))
© www.soinside.com 2019 - 2024. All rights reserved.