web2py: несколько таблиц: условная вставка / обновление / удаление: из одной формы

1

Я написал код для управления условным вставкой/обновлением/удалением несколько таблиц из одной формы в 'web2py'. Я согласен, код находится в очень сырой форме и не может быть "pythonic". Есть повторы кода. Но, по крайней мере, мне нужно что-то предпринять и построить изысканный состав.


MODELS:


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 )

CONTROLLERS:

‘modelwar’ controller will render the records from ‘mdlmst’ table


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

after clicking a particular record, ‘war_edit’ controller will

manage the tables – ‘mdlwr’ & ‘mdlextwr’


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

mdl_id is a variable identifying the ‘mdlmstid’ (which record to be modified)

 
    mdl_nm = request.args(1)

mdl_nm is a variable for getting the ‘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) fo­r x in db().select(db.wrmst.ALL)]), TR("Extended Warranty", SELECT(_type="select",_name="extwar",*[OPTION(x.extwrmstnm,_value=x.extwrms­­tid) for x in db().select(db.extwrmst.ALL)]), TR("", INPUT(_type='submit',_value='Save')), ))))

код >

pre- заполнить поля in'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, пустое, else update


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

else insert

 
        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) 

код >

VIEW для таблицы "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. tell me if I have coded anything stupid here. I would highly welcome any ideas/suggestions for improvements.

Спасибо, Vineet

  • 0
    В чем вопрос? Есть ли у вас ошибка или исключение? Мне не очень ясно, к чему вы стремитесь.
  • 0
    Я собираюсь: i) управлять несколькими таблицами из одной формы, ii) пользователь может добавлять / редактировать / удалять записи в разных таблицах. (т.е. комбинация добавления / редактирования / удаления). Следовательно, жесткое кодирование логики через CRUD или SQLFORM.factory невозможно. Поэтому мне нужно было определить значения, отправленные в FORM и вернуть значения из FORM. Исходя из этой логики, я могу определить, использовать ли вставку / обновление / удаление для каждой таблицы. iii) у меня нет ошибок в этом. Я прошу своих друзей здесь указать любую глупую логику / любой другой способ сделать это / улучшения и т. Д.
Показать ещё 1 комментарий
Теги:
web2py

1 ответ

2

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

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

Вы создали много-много отношений между таблицами "mdlmst" и "wrmst", а также многие отношения между "mdlmst" и "extwrmst". Хотя это не обязательно неправильно, мне кажется крайне маловероятным, что это то, что вы хотите.

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

  • 0
    Обратите внимание, что по умолчанию web2py создает поле 'id' для каждой таблицы. Однако, хотя это и не рекомендуется, вы можете явно создать поле с type = 'id', и web2py будет использовать это поле в качестве поля id с автоматическим приращением вместо создания поля 'id' для вас. См. Web2py.com/book/default/chapter/06?search=named+id+field .
  • 0
    @ Энтони, я этого не знал. Кажется бесполезным. Почему вы используете такую функцию? Книга гласит: «Это не рекомендуется, кроме как при доступе к устаревшим таблицам базы данных».
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню