6 Stimmen

Wie man dynamisch eine Selectbox / Dropdownbox in einem Formular mit web.py füllen?

Alle web.py-Formularbeispiele haben das folgende Format (von webpy.org):

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)

Ich möchte das Dropdown-Feld (form.Dropdown im obigen Beispiel) nicht statisch beim Deklarieren des Formulars füllen, sondern in der GET/POST-Methode mit Einträgen, die beim Aufruf der Seite aus einer Datenbanktabelle abgerufen werden.

Ich habe ein paar Stunden lang gesucht, kann aber nirgendwo einen Hinweis finden (google, webpy.org, google groups)

4voto

Andrey Kuzmin Punkte 4429

Sie können ein Formular deklarieren, indem Sie eine leere Liste an form.Dropdown args, und setzen Sie dann args in Ihrem Code.

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

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

Bitte verwenden Sie auch nicht form für die Variable wegen des Namenskonflikts mit web.form .

3voto

Dan Smith Punkte 753

Ich weiß, dass dies schon vor einer Weile gepostet wurde, aber ich habe dies getan, indem ich den Wert im Nachhinein eingestellt habe, wie in:

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

Auf diese Weise können Sie auch die integrierte Validierung verwenden, wenn Sie möchten. Ich endete auf der Suche nach einem Beispiel wie dieses auf den Brettern, so ist es wahrscheinlich Art von begraben Dokumentation weise.

2voto

TryPyPy Punkte 6206

Ich schlage vor, Sie erstellen die anderen Elemente und das Formular, dann in GET/POST erstellen Sie das Dropdown-Element, wie Sie wollen und:

# Create copy of the form
form = myform()

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X