Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 10, 2008 14:06:16

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

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 Дек. 10, 2008 14:13:21

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

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

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



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Дек. 10, 2008 14:19:17

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

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
апд.: Точно, не нужна была, просто дублер, убила ее нафиг. Она не в счет так что :-)



Отредактировано (Дек. 10, 2008 14:22:17)

Офлайн

#4 Дек. 10, 2008 18:28:10

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

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

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

hildi
bnr = session.query(Item).filter_by(bestellnr = kw).all()
hildi, лучше использовать валидацию, чем kw потом самой проверять.
http://docs.turbogears.org/1.0/ValidateDecorator
http://docs.turbogears.org/1.0#id21

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



Офлайн

#5 Дек. 10, 2008 18:31:16

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

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

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



Офлайн

#6 Дек. 11, 2008 05:39:57

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

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
апд.: Точно, не нужна была, просто дублер, убила ее нафиг. Она не в счет так что :-)
Воспользуйтесь системой контроля версий и беспощадно избавляйтесь от неиспользуемого кода, сэкономите массу времени и нервов :)
Про валидаторы вам уже сказал pythonwin - поверьте это намного облегчает написание методов контроллера, а я скажу еще вот о чем, подумайте - нужна ли вам такая здоровая форма? Трудно писать, трудно заполнять пользователю. Я обычно делаю одну форму для создания объекта - только поля, по которым можно идентифицировать объект, и форму для редактирования - делю объект на отдельные аспекты по смыслу, создаю страницу с табами, на каждом табе отдельная форма по конкретному аспекту, в идеале еще и отправляемая AJAXом :) - получается кучка простых методов в контроллере и пользователю гораздо удобнее.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Дек. 11, 2008 05:40:35)

Офлайн

#7 Дек. 11, 2008 08:43:36

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

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 Дек. 11, 2008 08:52:24

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

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

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

 
edit_widget = TableForm("TableFormEdit", fields = TableFormEdit(), action = "/view_full", text = "Submit me")
кусок “action = ”/view_full“” означает, что при нажатии на кнопку “Submit me” все данные формы уйдут в метод view_full

kw может быть в любом методе :) это способ передачи параметров
 
def foo(self, *args, **kw):
pass
args - это список позиционных параметров
kw - это словарь параметров с ключевыми словами



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Дек. 11, 2008 08:55:48)

Офлайн

#9 Дек. 11, 2008 09:04:10

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

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

кусок “action = ”/view_full“” означает, что при нажатии на кнопку “Submit me” все данные формы уйдут в метод view_full
черт возьми, я думала, это просто редирект, а данные отсылаются при сохранении сессии! Вот почему этот метод ругался на неожиданные параметры…
Спасибо! :-)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version