Flask wtforms SelectField als Array ?

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

Hallo zusammen,

Gibt es eine Möglichkeit SelectFields als Array bzw. mit Indizes zu definieren, um sie in einer Schleife bearbeiten zu können?
Folgendes hat leider nicht funktioniert:

form:

Code: Alles auswählen

from flask_wtf import FlaskForm
from wtforms import SubmitField, SelectField
from wtforms.validators import DataRequired, NumberRange

funktion = [[0]*3 for i in range(2)]
data = [[[0]*2 for i in range(3)]*3 for j in range(2)]

class ConfigForm(FlaskForm):
    funktion[0][0] = SelectField('1:')
    funktion[0][1] = SelectField('2:')
    funktion[0][2] = SelectField('3:')

    funktion[1][0] = SelectField('1:')
    funktion[1][1] = SelectField('2:')
    funktion[1][2] = SelectField('3:')
	
    data[0][0][0] = SelectField('')
    data[0][0][1] = SelectField('')	
    data[0][1][0] = SelectField('')
    data[0][1][1] = SelectField('')	
    data[0][2][0] = SelectField('')
    data[0][2][1] = SelectField('')
             
    data[1][0][0] = SelectField('')
    data[1][0][1] = SelectField('')	
    data[1][1][0] = SelectField('')
    data[1][1][1] = SelectField('')	
    data[1][2][0] = SelectField('')
    data[1][2][1] = SelectField('')
	
    submit = SubmitField('Save')
html:

Code: Alles auswählen

{% extends "base.html" %}

{% block content %}
    <form action="" method="post" novalidate>
        {{ form.hidden_tag() }}
		<div style="text-indent:10px;">
		<h4> funktion, Data A, Data B</h4>
		<h3>Switch 1</h3>
        <p>
            {{ form.funktion[0][0].label }}
            {{ form.funktion[0][0] }}
            {{ form.data[0][0][0].label }}
            {{ form.data[0][0][0] }}
            {{ form.data[0][0][1].label }}
            {{ form.data[0][0][1] }}				
        </p>
        <p>
            {{ form.funktion[0][1].label }}
            {{ form.funktion[0][1] }}
            {{ form.data[0][1][0].label }}
            {{ form.data[0][1][0] }}
            {{ form.data[0][1][1].label }}
            {{ form.data[0][1][1] }}			
        </p>        
		<p>
            {{ form.funktion[0][2].label }}
            {{ form.funktion[0][2] }}
            {{ form.data[0][2][0].label }}
            {{ form.data[0][2][0] }}
            {{ form.data[0][2][1].label }}
            {{ form.data[0][2][1] }}			
        </p>
        <h3>Switch 2</h3>
        <p>
            {{ form.funktion[1][0].label }}
            {{ form.funktion[1][0] }}
            {{ form.data[1][0][0].label }}
            {{ form.data[1][0][0] }}
            {{ form.data[1][0][1].label }}
            {{ form.data[1][0][1] }}				
        </p>
        <p>
            {{ form.funktion[1][1].label }}
            {{ form.funktion[1][1] }}
            {{ form.data[1][1][0].label }}
            {{ form.data[1][1][0] }}
            {{ form.data[1][1][1].label }}
            {{ form.data[1][1][1] }}			
        </p>        
		<p>
            {{ form.funktion[1][2].label }}
            {{ form.funktion[1][2] }}
            {{ form.data[1][2][0].label }}
            {{ form.data[1][2][0] }}
            {{ form.data[1][2][1].label }}
            {{ form.data[1][2][1] }}			
        </p>
        <p>{{ form.submit() }}</p>
		</div>
    </form>
{% endblock %}
Fehlermeldung:
jinja2.exceptions.UndefinedError: 'app.forms.ConfigForm object' has no attribute 'funktion'

Hat jemand eine Idee ?
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mockel: Die Klassenattribute von `Form`-Subklassen müssen vom Typ `Field` sein, nicht vom Typ `list`, denn nur mit `Field`-Typen kann WTForms Attribute auf dem Exemplar setzen das man aus dem `Form` erzeugt.

Das erstellen von Listen mit irgendwelchen Dummywerten die danach durch die tatsächlichen Werte ersetzt werden ist in Python übrigens ein „anti pattern“. In Python erstellt man eine leere Liste und hängt da dann die Werte an die man in der Liste haben möchte.

Die ganzen Codewiederholungen in Python und im Template würde man als Schleifen schreiben.

Du suchst wahrscheinlich `FormField` und `FieldList`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten