Портал Python-программистов

Форумы сайта python.su

Вы не зашли.

Объявление

Официальная wiki коммунити: wiki.python.su обсуждение

Официальная джаббер конференция коммунити: pythonua@conference.jabber.ru (всегда 20-35 онлайн участников). Настройки

КОД ОБОРАЧИВАТЬ В ТЕГИ [code][/code]
  • > TurboGears
  • > TG: форма редактирования записей в базе [RSS Feed]

#1 2008-12-10 15:06:16

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

TG: форма редактирования записей в базе

Извините, что снова к вам обращаемся, сами мы не местные и т. д. :-)

В общем, задача следующая: сделать форму редактирования записей в базе. Я вообще не знаю, с какой стороны к такой штуке подходить, и пришлось изобретать велосипед... Короче, выглядит все это так:

Генерируется хтмл-таблица с содержимым базы, зовут ее view_full. К каждому entry генерируется кнопочка со ссылкой типа "http://localhost:8080/edit?bestellnr=345".

Дальше в в контроллере пишу:

Код:

    @expose(template="team_ne.templates.edit")
    def edit(self, **kw):
        bnr = session.query(Item).filter_by(bestellnr = kw['bestellnr']).all()
        bnr0 = bnr[0]
        
        class TableFormEdit(widgets.WidgetsList):
              anbieter_list = getNewList()
              full_class_name = "turbogears.widgets.TableFormEdit"
              iddqd = Label(label='  ID  ', attrs={'size':45}, default = bnr0.iddqd)
              bestellnr = TextField(label='  Bestellnr. [SAP]  ', attrs={'size':45}, default = bnr0.bestellnr)
              typ = SingleSelectField(label='  GF Typ  ', default=bnr0.typ, options=["mono", "multi", "gradient"])
              anbieter = SingleSelectField(label='  Anbieter/Carrier  ', options=[(1,"s")])
              for i in q: # q = маленький запросик из другой таблицы, который выдает данные для подстановки в дропдаун.
                  anbieter.options.append(i.anbieter_name)
              anbieter.options.remove((1,"s"))    
              vertragsnr = TextField(label='  Vertragsnr. in OS5 ', default=bnr0.vertragsnr, attrs={'size':45})
              fasern = TextField(label='  Anzahl Fasern  ', default=bnr0.fasern, attrs={'size':45})
              laenge = TextField(label='  L'+u'\xe4'+'nge [Km]  ', default=bnr0.laenge, attrs={'size':45})

              """
                   ...еще штук 30 таких же полей ввода.
              """
        
        session.update(bnr0)
        session.commit()
        edit_widget = TableForm("TableFormEdit", fields = TableFormEdit(), action = "/view_full", text = "Submit me")

        return dict(edit_widget = edit_widget)

Вот. А проблема, собсно, в том, что при попытке отредактировать запись в базе через эту маску, выдается ошибка:

TypeError: view_full() got an unexpected keyword argument 'fasern' или все другие поля, если их последовательно закомментировать.

Вообще, не оч. понятно, каким образом в view_full() передаются значения полей из маски, там вроде ничего такого и рядом нет...

Что-то я совсем запуталась...

Неактивен

 

#2 2008-12-10 15:13:21

PooH
Питонер
Откуда: Барнаул
Зарегистрирован: 2006-12-05
Сообщений: 804
Профиль

Re: TG: форма редактирования записей в базе

Ну так покажите уже код для view_full, в данном случае достаточно объявления метода smile

Неактивен

 

#3 2008-12-10 15:19:17

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG: форма редактирования записей в базе

Вот код для вью_фулл:

Код:

    @expose(template = "team_ne.templates.view_full")
    def view_full(self):
        def getWerte():
            werte = []
            for i in it:
                       werte.append((i.bestellnr, i.typ,i.anbieter,i.anbieter_id, i.vertragsnr,i.fasern,i.laenge, 
                           i.laufzeit,i.miete,i.kosten,i.start,i.release,i.person,i.item,i.comment,
                           i.send_gruss,i.send_plz,i.send_ort,i.send_str,i.send_hnr,i.empf_gruss,
                           i.empf_plz,i.empf_ort,i.empf_str,i.empf_hnr))
            return werte
        dWerte = getWerte()
        return dict(dContent = fullList(), dWerte = dWerte)

И еще для фулл_лист на всякий случай (заодно попытаюсь вспомнить, зачем она там вообще была нужна, эта функция):

Код:

def fullList():
    it = session.query(Item).all()
    fList = []
    for i in it:
            fList.append((i.bestellnr, i.typ,i.anbieter,i.anbieter_id, i.vertragsnr,i.fasern,i.laenge, 
                           i.laufzeit,i.miete,i.kosten,i.start,i.release,i.person,i.item,i.comment,
                           i.send_gruss,i.send_plz,i.send_ort,i.send_str,i.send_hnr,i.empf_gruss,
                           i.empf_plz,i.empf_ort,i.empf_str,i.empf_hnr, i.iddqd))
    return fList

апд.: Точно, не нужна была, просто дублер, убила ее нафиг. Она не в счет так что :-)

Отредактированно hildi (2008-12-10 15:22:17)

Неактивен

 

#4 2008-12-10 19:28:10

pythonwin
Команда
Откуда: за компом
Зарегистрирован: 2006-07-18
Сообщений: 1293
Профиль

Re: TG: форма редактирования записей в базе

hildi, тебе можно дать два небольших совета?

hildi написал:

bnr = session.query(Item).filter_by(bestellnr = kw['bestellnr']).all()

hildi, лучше использовать валидацию, чем kw['bestellnr'] потом самой проверять.
http://docs.turbogears.org/1.0/ValidateDecorator
http://docs.turbogears.org/1.0#id21

по поводу генерации в методе класса для виджета - лучше это вынести в какой-нибудь файлик widgets.py.


...мир скучен для скучных людей. Сократ.
язык Python
framework TurboGears
форум по TurboGears

Неактивен

 

#5 2008-12-10 19:31:16

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG: форма редактирования записей в базе

Спасибо. Это временное решение пока, там еще много чего надо красиво сделать, потому что контроллер уже в длину километра два, наверное.

Неактивен

 

#6 2008-12-11 06:39:57

PooH
Питонер
Откуда: Барнаул
Зарегистрирован: 2006-12-05
Сообщений: 804
Профиль

Re: TG: форма редактирования записей в базе

hildi написал:

Вот код для вью_фулл:

Код:

    @expose(template = "team_ne.templates.view_full")
    def view_full(self):

Все содержимое формы будет передано в метод view_full как параметры, поэтому самый простой вариант объявить ее как:

Код:

    @expose(template = "team_ne.templates.view_full")
    def view_full(self, **kw):

содержимое формы будет доступно в словаре kw

hildi написал:

апд.: Точно, не нужна была, просто дублер, убила ее нафиг. Она не в счет так что :-)

Воспользуйтесь системой контроля версий и беспощадно избавляйтесь от неиспользуемого кода, сэкономите массу времени и нервов smile
Про валидаторы вам уже сказал pythonwin - поверьте это намного облегчает написание методов контроллера, а я скажу еще вот о чем, подумайте - нужна ли вам такая здоровая форма? Трудно писать, трудно заполнять пользователю. Я обычно делаю одну форму для создания объекта - только поля, по которым можно идентифицировать объект,  и форму для редактирования - делю объект на отдельные аспекты по смыслу, создаю страницу с табами, на каждом табе отдельная форма по конкретному аспекту, в идеале еще и отправляемая AJAXом smile - получается кучка простых методов в контроллере и пользователю гораздо удобнее.

Отредактированно PooH (2008-12-11 06:40:35)

Неактивен

 

#7 2008-12-11 09:43:36

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG: форма редактирования записей в базе

Форму не я придумала, а коллеги, которые ее хотят. И в общем она нормально работает, довольно быстро. Может быть, она и видоизменится со временем, пока я разберусь с ТГ, но это маловероятно. Я ведь вообще-то не программист, а просто подрабатываю себе на оплату университета :-)
А валидаторы я действительно пока не поняла, но на рожд. каникулах как раз сяду с ними разбираться, когда у меня будет побольше времени, чтобы провести его на работе. Вот такая я балбеска. Про АЯКС я пока даже не думаю, он слишком сложный :-)

Код:

 @expose(template = "team_ne.templates.view_full")
    def view_full(self):
            werte = []
            for i in it:
                       werte.append((i.bestellnr, i.typ,i.anbieter,i.anbieter_id, i.vertragsnr,i.fasern,i.laenge, 
                           i.laufzeit,i.miete,i.kosten,i.start,i.release,i.person,i.item,i.comment,
                           i.send_gruss,i.send_plz,i.send_ort,i.send_str,i.send_hnr,i.empf_gruss,
                           i.empf_plz,i.empf_ort,i.empf_str,i.empf_hnr))
            return dict(dWerte = werte)

Это не вывод из формы, а вывод всех строк из базы, но не всех столбцов... Разве там бывают kw?

Неактивен

 

#8 2008-12-11 09:52:24

PooH
Питонер
Откуда: Барнаул
Зарегистрирован: 2006-12-05
Сообщений: 804
Профиль

Re: TG: форма редактирования записей в базе

У вас выше кусок кода:

Код:

 
edit_widget = TableForm("TableFormEdit", fields = TableFormEdit(), action = "/view_full", text = "Submit me")

кусок "action = "/view_full"" означает, что при нажатии на кнопку "Submit me" все данные формы уйдут в метод view_full

kw может быть в любом методе smile это способ передачи параметров

Код:

 
def foo(self, *args, **kw):
    pass

args - это список позиционных параметров
kw - это словарь параметров с ключевыми словами

Отредактированно PooH (2008-12-11 09:55:48)

Неактивен

 

#9 2008-12-11 10:04:10

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG: форма редактирования записей в базе

кусок "action = "/view_full"" означает, что при нажатии на кнопку "Submit me" все данные формы уйдут в метод view_full

черт возьми, я думала, это просто редирект, а данные отсылаются при сохранении сессии! Вот почему этот метод ругался на неожиданные параметры...
Спасибо! :-)

Неактивен

 
  • > TurboGears
  • TG: форма редактирования записей в базе [RSS Feed]

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Board footer

Реклама: