Hi Robin,
Unfortunately your code is unreadable here on the g-groups UI, anyway
you don't need this Forms class, what you need is just passing a
callable as options to the SingleSelectField, for example:
def get_options():
return [(p.id, p.title) for p in Project.select()]
and then:
select = widgets.SingleSelectField(name="projectid", label="Project",
options=get_options, validator=validators.NotEmpty)
use this inside a simple TableForm, for example:
class MyFields(widgets.WidgetsList):
name = TextField()
projectid = select
robin_form = TableForm(fields=MyFields())
and then:
@validate(form=robin_form)
Hope this helps, and sorry for the lack of good doc. :-(
Ciao
Michele
PS
If you want to send me the code I can be more precise probably (when I
get home). ;-)
Robin Haswell wrote:
> Hey there
>
> I have a small problem with using widgets for my form. I think the
> problem lies in the fact that the form contains a select field which is
> pulled from the database, and therefore needs to be "refreshed" every
> time that data changes - this breaks links with
> @validate(form=forms.myform), and from then on every time I submit an
> invalid form I don't get messages and my data isn't populated.
>
> Below is the code for my app. You'll notice a call to forms.refresh
> after I save an adcode. It's saving an adcode which breaks everything.
>
> The only solution I can think of is reloading the entire controller, but
> it doesn't sound optimal to me. Could someone suggest another approach?
>
> Thanks
>
> -Rob
>
> # controllers.py
>
> import cherrypy
> import turbogears
> from turbogears.toolbox.catwalk import CatWalk
> from turbogears import controllers
> from turbogears import identity
> from turbogears import widgets
> from turbogears import validators
> from turbogears.fastdata import *
>
> import model
> from model import *
>
> class Forms:
>
> def __init__(self):
> self.refresh()
>
> def refresh(self):
> self.allprojects = widgets.TableForm(fields=[
> widgets.SingleSelectField(name="projectid",
> label="Project",
> options=[(p.id, p.title) for p in
> Project.select()], validator=validators.NotEmpty)
> ], submit_text="Edit")
> self.project = widgets.TableForm(fields=[
> widgets.TextField(name="title", label="Project
> title", validator=validators.NotEmpty),
> widgets.TextField(name="domain", label="Domain",
> validator=validators.NotEmpty),
> widgets.SingleSelectField(name="adcode",
> label="Advertisements",
> options=[(a.id, a.name) for a in
> Adcode.select()], validator=validators.NotEmpty),
> widgets.TextArea(name="copy", label="Copy",
> validator=validators.NotEmpty),
> widgets.TextArea(name="keywords",
> label="Keywords", validator=validators.NotEmpty),
> widgets.HiddenField(name="projectid")
> ], submit_text="Save")
> self.alladcodes = widgets.TableForm(fields=[
> widgets.SingleSelectField(name="adcodeid",
> label="Adcode", validator=validators.NotEmpty,
> options=[(a.id, a.name) for a in
> Adcode.select()])
> ], submit_text="Edit")
> self.adcodes = widgets.TableForm(fields=[
> widgets.TextField(name="name",
> validator=validators.NotEmpty),
> widgets.TextArea(name="adcode",
> validator=validators.NotEmpty),
> widgets.HiddenField(name="adcodeid")
> ], submit_text="Save")
>
> forms = Forms()
>
> class Pyrgen(controllers.RootController):
>
> catwalk = CatWalk(model, allowedHosts=["192.168.0.0/24"])
>
> @turbogears.expose(template=".templates.index")
> def index(self, tg_errors=None):
> return dict(
> title = "Manage Projects",
> editprojectform = forms.allprojects,
> projectform = forms.project
> )
> @turbogears.expose(template=".templates.adcodes")
> def adcodes(self):
> return dict(
> title="Manage Adcodes",
> all=forms.alladcodes,
> form=forms.adcodes,
> value={},
> )
>
> @turbogears.expose(template=".templates.index")
> @turbogears.validate(form=forms.project)
> @turbogears.error_handler(index)
> def SaveProject(self, projectid, title, domain, adcode, copy,
> keywords):
> try:
> p = Project.get(projectid)
> p.title = title
> p.domain = domain
> p.adcode = adcode
> p.copy = copy
> except ValueError:
> p = Project(
> title=title,
> domain=domain,
> adcode=adcode,
> copy=copy)
> keywords = keywords.split("\n")
> keywords = [ keyword.strip() for keyword in keywords if
> keyword.strip() ]
> for keyword in p.keywords:
> p.removeKeyword(keyword)
> for keyword in keywords:
> try:
> kw = Keyword.byKeyword(keyword)
> except SQLObjectNotFound:
> kw = Keyword(keyword=keyword)
> p.addKeyword(kw)
> turbogears.flash("Project saved")
> return dict(
> title="Project Saved",
> editprojectform = forms.allprojects,
> projectform = forms.project
> )
> @turbogears.expose(template=".templates.editproject")
> def EditProject(self, projectid):
> p = Project.get(projectid)
> values = dict(
> projectid=p.id,
> title=p.title,
> domain=p.domain,
> adcode=p.adcode,
> copy=p.copy,
> keywords="\n".join([ kw.keyword for kw in
> p.keywords ])
> )
> return dict(
> title="Edit Project: "+p.title,
> form=forms.project,
> values=values
> )
>
> @turbogears.expose(template=".templates.adcodes")
> @turbogears.validate(form=forms.adcodes)
> def SaveAdcode(self, adcodeid, name, adcode):
> try:
> a = Adcode.get(adcodeid)
> a.name = name
> a.adcode = adcode
> except:
> a = Adcode(
> name=name,
> adcode=adcode,
> )
> turbogears.flash("Adcode Saved")
> forms.refresh()
> return dict(
> title="Adcode Saved",
> all=forms.alladcodes,
> form=forms.adcodes,
> value={}
> )
(Editing disabled while spellchecking)
Stop spell checking
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/turbogears
-~----------~----~----~----~------~----~------~--~---