2011-01-14 14 views
6

Wszystkie przykłady form web.py są w następującym formacie (od webpy.org):Jak dynamicznie wypełniać pole selectbox/dropdownbox w formularzu przy użyciu 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) 

Nie chcę, aby wypełnić pole rozwijane (form.Dropdown w powyższym przykładzie) statyczne podczas deklarowania formularz, ale w metodzie GET/POST przy użyciu wpisów pobranych z tabeli bazy danych po wywołaniu strony.

Rozglądałem się na kilka godzin, ale nie mogę znaleźć nigdzie wskazówkę (google, webpy.org, Google Groups)

Odpowiedz

2

Proponuję utworzyć inne elementy i formę, a następnie w GET/POST utworzyć element rozwijaną jak chcesz i:

# Create copy of the form 
form = myform() 

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

Nie sądzę, że dobrze jest załatać dane wejściowe formularza w tym przypadku (ale może to być przydatne w innych sytuacjach). W tym konkretnym przypadku proponuję utworzyć 'Dropdown' z' args = [] ', a następnie ustawić' args' listy rozwijanej w kopii formularza. –

3

znam ten został opublikowany jakiś czas temu, ale zrobiłem to poprzez ustawienie wartości po tym, jak w:

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

ten pozwala na Użyj wbudowana walidacja również, jeśli chcesz. Skończyło się na znalezieniu takiego przykładu na tablicach, więc jest to prawdopodobnie rodzaj pogrzebanej dokumentacji mądrej.

4

Możesz zadeklarować formularz, przekazując pustą listę do form.Dropdown args, a następnie ustawić args w swoim kodzie.

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

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

Także proszę nie używać form dla zmiennej, ponieważ z nazwą starcia z web.form.