Я написал код для управления условной вставкой / обновлением / удалением нескольких таблиц из одной формы в 'web2py'.Я согласен, код в очень сырой форме и не может быть «питоническим».Есть повторы кода.Но, по крайней мере, у меня есть кое-что, что можно сделать и построить изысканную структуру.
МОДЕЛИ:
<code>
db.define_table('mdlmst',
Field('mdlmstid','id'),
Field('mdlmstcd'),
Field('mdlmstnm'),
migrate=False,
format='%(mdlmstnm)s'
) </p>
<p>db.define_table('wrmst',
Field('wrmstid','id'),
Field('wrmstcd'),
Field('wrmstnm'),
migrate=False,
format='%(wrmstnm)s'
) </p>
<p>db.define_table('extwrmst',
Field('extwrmstid','id'),
Field('extwrmstcd'),
Field('extwrmstnm'),
migrate=False,
format='%(extwrmstnm)s'
)
из ФОРМЫ, данные будут заполнены в следующих двух таблицах
<code>
db.define_table('mdlwr',
Field('mdlwrid','id'),
Field('mdlmstid',db.mdlmst),
Field('wrmstid',db.wrmst),
migrate=False
) </p>
<p>db.define_table('mdlextwr',
Field('mdlextwrid','id'),
Field('mdlmstid',db.mdlmst),
Field('extwrmstid',db.extwrmst),
migrate=False
) </p>
<h2>
КОНТРОЛЛЕРЫ:
контроллер 'modelwar' будет отображать записи из таблицы 'mdlmst'
<code>
def modelwar():
models = db(db.mdlmst.mdlmstid>0).select(orderby=db.mdlmst.mdlmstnm)
return dict(models=models)
посленажав на конкретную запись, контроллер 'war_edit' будет
управлять таблицами - 'mdlwr' & 'mdlextwr'
<code>
def war_edit():
mdl_id = request.args(0)
mdl_id - это переменная, идентифицирующая'mdlmstid' (какая запись будет изменена)
<code>
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</p>
<pre><code>form_war=FORM(TABLE(TR("Basic Warranty",
SELECT (_type = "select", _ name = "baswar", * [OPTION (x.wrmstnm, _value = x.wrmstid) для x в db (). Select (db.wrmst.ALL)]), TR ("Расширенная гарантия ", SELECT (_type =" select ", _ name =" extwar ", * [OPTION (x.extwrmstnm, _value = x.extwrmstid) для x в db (). Select (db.extwrmst.ALL)]),TR ("", INPUT (_type = 'submit', _ value = 'Save')),))))
предварительно заполнить поля в'form_war'
<code>
if len(warlist)>0:
form_war.vars.baswar = warlist[0].wrmstid
if len(extwarlist)>0:
form_war.vars.extwar = extwarlist[0].extwrmstid
после успешной отправки формы, управлять таблицей 'mdlwr'
<code>
if form_war.accepts(request.vars, session):
если в списке была какая-то запись, извлеченная из базы данных и отправленная в FORM,
<code>
if len(warlist)>0:
удалить, если значение, возвращаемое из поля FORM, пустое, иначе обновить
<code>
if form_war.vars.baswar==''
warset.delete()
else:
warset.update(wrmstid=form_war.vars.baswar)
else insert
<code>
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) </p>
<pre><code> response.flash = 'Warranty definition saved'
return dict(form_war=form_war,mdlnm=mdl_nm)
ПРОСМОТР для таблицы «mdlmst»
<code>
{{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'}} </p>
jQuery(document).ready(function()
{ jQuery('.smarttable').dataTable();});
<h1>Modelwise Warranty Master</h1>
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}}
<p>
Pl.скажи мне, если я закодировал что-нибудь глупое здесь.Буду очень признателен за любые идеи / предложения по улучшению.
Спасибо, Vineet