Форумы сайта 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)Вот. А проблема, собсно, в том, что при попытке отредактировать запись в базе через эту маску, выдается ошибка:
TypeError: view_full() got an unexpected keyword argument 'fasern' или все другие поля, если их последовательно закомментировать.
Вообще, не оч. понятно, каким образом в 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апд.: Точно, не нужна была, просто дублер, убила ее нафиг. Она не в счет так что :-)
Отредактированно hildi (2008-12-10 15:22:17)
Неактивен
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.
Неактивен
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ом
- получается кучка простых методов в контроллере и пользователю гораздо удобнее.
Отредактированно PooH (2008-12-11 06: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)Это не вывод из формы, а вывод всех строк из базы, но не всех столбцов... Разве там бывают kw?
Неактивен
У вас выше кусок кода:
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):
passargs - это список позиционных параметров
kw - это словарь параметров с ключевыми словами
Отредактированно PooH (2008-12-11 09:55:48)
Неактивен
кусок "action = "/view_full"" означает, что при нажатии на кнопку "Submit me" все данные формы уйдут в метод view_full
черт возьми, я думала, это просто редирект, а данные отсылаются при сохранении сессии! Вот почему этот метод ругался на неожиданные параметры...
Спасибо! :-)
Неактивен