【发布时间】:2011-09-07 01:21:56
【问题描述】:
我已经编写了用于管理条件插入/更新/删除的代码 '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'
)
从表格中,数据将填充到以下两个表中
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
)
控制器:
‘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",
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’中的字段
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):
如果列表中有任何记录从数据库中提取并发送到 FORM,
if len(warlist)>0:
如果FORM字段返回值为空则删除,否则更新
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}}
PL。告诉我我是否在这里编写了任何愚蠢的代码。
我非常欢迎任何改进的想法/建议。
谢谢, 维内特
【问题讨论】:
-
问题是什么?你有错误或异常吗?我不太清楚你的目标是什么。
-
我的意图是:i)从一个表单管理多个表,ii)用户可以添加/编辑/删除不同表的条目。 (即添加/编辑/删除的组合)。因此,不可能通过 CRUD 或 SQLFORM.factory 对逻辑进行硬编码。所以我需要确定发送到 FORM 的值并从 FORM 中返回值。根据该逻辑,我可以确定是否对每个表使用插入/更新/删除。 iii) 我在这方面没有任何错误。我要求我的朋友在这里查明任何愚蠢的逻辑/任何其他方法/改进等。
-
好的,我没有技术知识可以回答你,但恕我直言,这个问题没有太多机会被回答。请查看FAQ。一般来说,问题越具体,得到好的答案的机会就越大。