web2py: несколько таблиц: условная вставка / обновление / удаление: из одной формы - PullRequest
1 голос
/ 02 июня 2011

Я написал код для управления условной вставкой / обновлением / удалением нескольких таблиц из одной формы в '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

1 Ответ

2 голосов
/ 02 июня 2011

Ваш дизайн базы данных выглядит странно для меня.

В каждой таблице у вас есть поле типа 'id'.Это заменит поле идентификатора, автоматически генерируемое web2py - плохая идея.Из книги web2py: "Не объявляйте поле с именем" id ", потому что оно все равно создается web2py. Каждая таблица имеет поле с именем" id "по умолчанию. Это целочисленное поле с автоинкрементом (начиная с1) используется для перекрестных ссылок и для того, чтобы сделать каждую запись уникальной, поэтому «id» является первичным ключом.еще одно отношение многие ко многим между «mdlmst» и «extwrmst».Хотя это не обязательно неправильно, мне кажется невероятным, что это то, что вы хотите.

Мне кажется, что ваша база данных нуждается в работе.Это должно быть решено, прежде чем вы начнете создавать формы.

...