我编写了用于管理条件插入/更新/删除的代码 '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'
)
来自FORM的
db.define_table('mdlwr',
Field('mdlwrid','id'),
Field('mdlmstid',db.mdlmst),
Field('wrmstid',db.wrmst),
migrate=False
)
db.define_table('mdlextwr',
Field('mdlextwrid','id'),
Field('mdlmstid',db.mdlmst),
Field('extwrmstid',db.extwrmst),
migrate=False
)
def modelwar():
models = db(db.mdlmst.mdlmstid>0).select(orderby=db.mdlmst.mdlmstnm)
return dict(models=models)
单击特定记录后
管理表格 - 'mdlwr'& 'mdlextwr'
def war_edit():
mdl_id = request.args(0)
mdl_nm = request.args(1)
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",
SELECT(_type="select",_name="baswar",*[OPTION(x.wrmstnm,_value=x.wrmstid)
for x in db().select(db.wrmst.ALL)]),
TR("Extended Warranty",
SELECT(_type="select",_name="extwar",*[OPTION(x.extwrmstnm,_value=x.extwrmstid)
for x in db().select(db.extwrmst.ALL)]),
TR("", INPUT(_type='submit',_value='Save')), ))))
form_war=FORM(TABLE(TR("Basic Warranty",
if len(warlist)>0:
form_war.vars.baswar = warlist[0].wrmstid
if len(extwarlist)>0:
form_war.vars.extwar = extwarlist[0].extwrmstid
if form_war.accepts(request.vars, session):
如果从FORM字段返回的值为空,则
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)
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)
PL。告诉我,如果我在这里编写任何愚蠢的东西。
我非常欢迎任何有关改进的想法/建议。
谢谢, 维尼特
答案 0 :(得分:2)
您的数据库设计对我来说很奇怪。
在每个表格中,您都有一个类型为“id”的字段。这将替换web2py自动生成的id字段 - 一个坏主意。从web2py book:“不要声明一个名为”id“的字段,因为一个是由web2py创建的。默认情况下,每个表都有一个名为”id“的字段。它是一个自动增量整数字段(从1)用于交叉引用并使每条记录都是唯一的,因此“id”是主键“
你在'mdlmst'和'wrmst'表之间建立了多对多的关系,并在'mdlmst'和'extwrmst'之间建立了多对多的关系。虽然这不一定是错的,但这让我感到非常不可能,这就是你想要的。
我的感觉是你的数据库设计需要工作。在开始设计表单之前,应该对此进行整理。