web2py:多个表:条件插入/更新/删除:从一个窗体

2024-10-03 23:19:47 发布

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

我已经编写了用于管理条件插入/更新/删除的代码 “web2py”中单个表单中的多个表。 我同意,代码的形式非常原始,可能不是“pythonic”。 有代码重复。 但至少我还有一些事情要做&打造一个精致的 结构。在


型号:


db.define_table('mdlmst', 
              Field('mdlmstid','id'), 
              Field('mdlmstcd'), 
              Field('mdlmstnm'), 
              migrate=False, 
              format='%(mdlmstnm)s' 
              ) 

db.define_table('wrmst', Field('wrmstid','id'), Field('wrmstcd'), Field('wrmstnm'), migrate=False, format='%(wrmstnm)s' )

db.define_table('extwrmst', Field('extwrmstid','id'), Field('extwrmstcd'), Field('extwrmstnm'), migrate=False, format='%(extwrmstnm)s' )

从表单中,数据将填充到以下两个表中

^{pr2}$

控制器:

“modelwar”控制器将呈现“mdlmst”表中的记录


def modelwar(): 
    models = db(db.mdlmst.mdlmstid>0).select(orderby=db.mdlmst.mdlmstnm) 
    return dict(models=models) 

点击特定记录后,“war_edit”控制器将

管理表格-“mdlwr”和“mdlextwr”


def war_edit(): 
    mdl_id = request.args(0)

mdl_id是标识“mdlmstid”(要修改的记录)的变量

 
    mdl_nm = request.args(1)

mdl_nm是获取“mdlmstnm”的变量

 
    warset = db(db.mdlwr.mdlmstid==mdl_id)        # fetch a set 
    extwarset = db(db.mdlextwr.mdlmstid==mdl_id)  # fetch a set 
    warlist = db(db.mdlwr.mdlmstid==mdl_id).select() # get a ROW object 
    extwarlist = db(db.mdlextwr.mdlmstid==mdl_id).select() # get a ROW object

form_war=FORM(TABLE(TR("Basic Warranty", 

选择(_type=“SELECT”,_name=“baswar”,*[选项(x.wrmstnm,_value=x.wrmstid) for­r x in db()。选择(所有数据库)]), TR(“延长保修期”, 选择(_type=“SELECT”,_name=“extwar”,*[选项(x.extwrmstnm,_value=x.extwrms-tid) 对于db()中的x。选择(全部数据库)]), TR(“,输入(_type='submit',\u value='Save'),)))

预先填充“表单”中的字段


    if len(warlist)>0: 
        form_war.vars.baswar = warlist[0].wrmstid 
    if len(extwarlist)>0: 
        form_war.vars.extwar = extwarlist[0].extwrmstid 

成功提交表单后,管理表“mdlwr”


    if form_war.accepts(request.vars, session): 

如果列表中有从数据库提取并发送到窗体的记录


        if len(warlist)>0:

如果从表单字段返回的值为空,则删除,否则更新


            if form_war.vars.baswar==''
                warset.delete() 
            else: 
                warset.update(wrmstid=form_war.vars.baswar)

否则插入

 
        else: 
            db.mdlwr.insert(mdlmstid=mdl_id, wrmstid=form_war.vars.baswar)

类似地,管理表“mdlextwr”


        if len(extwarlist)>0: 
            if form_war.vars.extwar=='': 
                extwarset.delete() 
            else: 
                extwarset.update(extwrmstid=form_war.vars.extwar) 
        else: 
            db.mdlextwr.insert(mdlmstid=mdl_id, extwrmstid=form_war.vars.extwar) 

    response.flash = 'Warranty definition saved' 
return dict(form_war=form_war,mdlnm=mdl_nm) 

“mdlmst”表的视图


{{response.files.append(URL(r=request,c='static',f='jquery.dataTables.min.j­­ 
s'))}} 
{{response.files.append(URL(r=request,c='static',f='demo_table.css'))}} 
{{extend 'layout.html'}} 

jQuery(document).ready(function() 
{   jQuery('.smarttable').dataTable();}); 

Modelwise Warranty Master

Model IDModel CodeModel Name {{for model in models:}} {{=model.mdlmstid}} {{=model.mdlmstcd}} {{=model.mdlmstnm}} {{=A('edit warranty',_href=URL('war_edit',args=[model.mdlmstid,model.mdlmstnm]))}} {{pass}}

告诉我这里有没有什么愚蠢的代码。 我非常欢迎任何改进意见/建议。

谢谢, 维涅特


Tags: formidfielddbmodelifvarsmdl
1条回答
网友
1楼 · 发布于 2024-10-03 23:19:47

我觉得你的数据库设计很奇怪。在

在每个表中都有一个“id”类型的字段。这将替换web2py自动生成的id字段-这是个坏主意。在web2py的书中:“不要声明一个名为”id“的字段,因为它是由web2py创建的。默认情况下,每个表都有一个名为“id”的字段。它是一个自动递增的整数字段(从1开始),用于交叉引用和使每个记录唯一,因此“id”是主键“

您在表“mdlmst”和“wrmst”之间创建了多对多关系,在“mdlmst”和“extwrmst”之间创建了另一个多对多关系。虽然这不一定是错的,但我觉得这不太可能是你想要的。在

我觉得你的数据库设计需要工作。在你开始设计表单之前,应该先把它整理好。在

相关问题 更多 >