Форум сайта python.su
Извините, что снова к вам обращаемся, сами мы не местные и т. д. :-)
В общем, задача следующая: сделать форму редактирования записей в базе. Я вообще не знаю, с какой стороны к такой штуке подходить, и пришлось изобретать велосипед… Короче, выглядит все это так:
Генерируется хтмл-таблица с содержимым базы, зовут ее 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)
Офлайн
Ну так покажите уже код для view_full, в данном случае достаточно объявления метода :)
Офлайн
Вот код для вью_фулл:
@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)
Офлайн
hildi, тебе можно дать два небольших совета?
hildihildi, лучше использовать валидацию, чем kw потом самой проверять.
bnr = session.query(Item).filter_by(bestellnr = kw).all()
Офлайн
Спасибо. Это временное решение пока, там еще много чего надо красиво сделать, потому что контроллер уже в длину километра два, наверное.
Офлайн
hildiВсе содержимое формы будет передано в метод view_full как параметры, поэтому самый простой вариант объявить ее как:
Вот код для вью_фулл:@expose(template = "team_ne.templates.view_full")
def view_full(self):
@expose(template = "team_ne.templates.view_full")
def view_full(self, **kw):
hildiВоспользуйтесь системой контроля версий и беспощадно избавляйтесь от неиспользуемого кода, сэкономите массу времени и нервов :)
апд.: Точно, не нужна была, просто дублер, убила ее нафиг. Она не в счет так что :-)
Отредактировано (Дек. 11, 2008 05:40:35)
Офлайн
Форму не я придумала, а коллеги, которые ее хотят. И в общем она нормально работает, довольно быстро. Может быть, она и видоизменится со временем, пока я разберусь с ТГ, но это маловероятно. Я ведь вообще-то не программист, а просто подрабатываю себе на оплату университета :-)
А валидаторы я действительно пока не поняла, но на рожд. каникулах как раз сяду с ними разбираться, когда у меня будет побольше времени, чтобы провести его на работе. Вот такая я балбеска. Про АЯКС я пока даже не думаю, он слишком сложный :-)
@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)
Офлайн
У вас выше кусок кода:
edit_widget = TableForm("TableFormEdit", fields = TableFormEdit(), action = "/view_full", text = "Submit me")
def foo(self, *args, **kw):
pass
Отредактировано (Дек. 11, 2008 08:55:48)
Офлайн
кусок “action = ”/view_full“” означает, что при нажатии на кнопку “Submit me” все данные формы уйдут в метод view_fullчерт возьми, я думала, это просто редирект, а данные отсылаются при сохранении сессии! Вот почему этот метод ругался на неожиданные параметры…
Офлайн