Flask wtforms SelectField - Auswahl übernehmen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Mockel
User
Beiträge: 5
Registriert: Dienstag 18. Februar 2020, 16:23

Hallo Phyton und Flask Fans !

Ich möchte eine Web-Konfigurations-App für ein displayloses Gerät (mit Raspberry Pi) schreiben.
Anfangs lief das ganz gut, jetzt hänge ich bei dem Thema die vom Benutzer selektierte Auswahl in das Formular zu übernehmen.
Finde im Netz leider immer nur das User-Login-Beispiel, was mit hier aber nicht weiterhilft...

Mein Problem ist, dass beim Drücken des "submit" bzw. "save"-buttons wieder das ursprüngliche Formular erscheint (mit den default Selektionen).
Ich möchte aber, dass das Formular auch nach dem submit die ausgewählten Auswahlen beibehält.
Wie kann ich das realisieren ?

Bestimmt 'ne Anfängerfrage und ganz einfach. Aber ich hab schon viel gesucht und ausprobiert und krieg es einfach nicht hin :-(
Würde mich freuen, wenn mir hier jemand auf die Sprünge hilft.
Im Voraus schon vielen Dank an alle Helfer.

Habe die sourcen mal auf das absolut notwendige reduziert:

forms.py:

Code: Alles auswählen

from flask_wtf import FlaskForm
from wtforms import SelectField, SubmitField

class ConfigForm(FlaskForm):
    function_s1_1 = SelectField('Funktion 1:')
    function_s1_2 = SelectField('Funktion 2:')
    function_s1_3 = SelectField('Funktion 3:')
    submit = SubmitField('Save')
    
routes.py:

Code: Alles auswählen

from flask import render_template, flash, redirect, url_for, request
from app import app
from app.forms import ConfigForm

functions = ["NoteOn"   , "NoteOff"   , "PageUp"   , "PageDown" ]
functionentries = []

for i in range (0, 4):
	functionentries.append((str(i), functions[i]))
	
@app.route('/', methods=['GET', 'POST'])
def config():
    form = ConfigForm()
    
    form.function_s1_1.choices=functionentries
    form.function_s1_2.choices=functionentries
    form.function_s1_3.choices=functionentries

    if request.method == 'GET':	   
        return render_template('config.html', title='Config Page', form=form)   
    	   
    if request.method == 'POST':
       sel_funct1 = request.form.get('function_s1_1')
       sel_funct2 = request.form.get('function_s1_2')
       sel_funct3 = request.form.get('function_s1_3')	  
       print(sel_funct1, sel_funct2, sel_funct3)
       return redirect(url_for('config'))
 
config.html:

Code: Alles auswählen

{% extends "base.html" %}

{% block content %}
    <form action="" method="post">
        {{ form.hidden_tag() }}
	   <div style="text-indent:10px;">
	   <h3>Switch 1</h3>
        <p>
            {{ form.function_s1_1.label }}
            {{ form.function_s1_1 }}
        </p>
        <p>
            {{ form.function_s1_2.label }}
            {{ form.function_s1_2 }}
        </p>        
		<p>
            {{ form.function_s1_3.label }}
            {{ form.function_s1_3 }}
        </p>
        <p>{{ form.submit() }}</p>
	   </div>
    </form>
{% endblock %}
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Du benutzt im 'POST'-Zweig das `ConfigForm` überhaupt nicht. Das würde man dort machen und dann nur ein ``return`` ausserhalb der ``if``\s und zwar das `render_template()` was im "GET"-Zweig steht. Womit der Zweig überflüssig wird, denn da steht dann ja nix mehr drin.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Mockel
User
Beiträge: 5
Registriert: Dienstag 18. Februar 2020, 16:23

Ok, funktioniert jetzt. Und jetzt ist mir auch klar, dass das redirect mir die Einträge immer wieder zurückgesetzt hat.
Vielen Dank an __blackjack__ für die schnelle und wirksame Hilfe !
Muss/kann ich das Thema irgendwie als "gelöst" markieren oder anderwsweitig abschliessen?
Antworten