2011-01-14 4 views
6

Tutti gli esempi di forma web.py sono nel seguente formato (da webpy.org):Come riempire dinamicamente una selectbox/dropdownbox in un modulo usando web.py?

myform = form.Form( 
    form.Textbox("boe"), 
    form.Textbox("bax", 
     form.notnull, 
     form.regexp('\d+', 'Must be a digit'), 
     form.Validator('Must be more than 5', lambda x:int(x)>5)), 
    form.Textarea('moe'), 
    form.Checkbox('curly'), 
    form.Dropdown('french', ['mustard', 'fries', 'wine'])) 

class index: 
    def GET(self): 
     form = myform() 
     # make sure you create a copy of the form by calling it (line above) 
     # Otherwise changes will appear globally 
     return render.formtest(form) 

    def POST(self): 
     form = myform() 
     if not form.validates(): 
      return render.formtest(form) 
     else: 
      # form.d.boe and form['boe'].value are equivalent ways of 
      # extracting the validated arguments from the form. 
      return "Grrreat success! boe: %s, bax: %s" % (form.d.boe, form['bax'].value) 

Non voglio per riempire la casella a discesa (form.Dropdown nell'esempio di cui sopra) statica quando si dichiara il modulo, ma nel metodo GET/POST utilizzando le voci recuperate da una tabella del database quando viene chiamata la pagina.

Ho cercato per un paio d'ore, ma non riesco a trovare da nessuna parte un suggerimento (google, webpy.org, gruppi di google)

risposta

2

Vi suggerisco di creare gli altri elementi e la forma, poi in GET/POST creare l'elemento discesa come si desidera e:

# Create copy of the form 
form = myform() 

# Append the dropdown to the form elements. 
form.inputs = tuple(list(form.inputs) + [mydropdown]) 
+2

Non credo che sia opportuno applicare gli input del form in questo caso (ma potrebbe essere utile in qualche altra situazione). Per questo caso particolare, suggerisco di creare 'Dropdown' con' args = [] 'e quindi impostare' args' nella copia del modulo. –

3

so che questo è stato pubblicato qualche tempo fa, ma ho fatto questo impostando il valore in seguito, come in:

form = input_form() 
form.get('some_input').value = _id 
return render.some_template(form) 

questo permette di Usa il convalida integrata anche se per favore. Alla fine ho trovato un esempio come questo sulle tavole, quindi è probabilmente una specie di documentazione sepolta.

4

È possibile dichiarare il modulo passando la lista vuota a form.Dropdown args e quindi impostare args nel codice.

# form declaration 
MyForm = form.Form(form.Dropdown("french", [])) 

# then in your controller 
my_form = MyForm() 
my_form.french.args = ['mustard', 'fries', 'wine'] 

Inoltre si prega di non utilizzare form per la variabile, a causa del nome scontro con web.form.