(Flask) WTForm отображается с неправильными значениями

В настоящее время я работаю над веб-приложением «исследователь базы данных» для университетского проекта. В основном я создаю сайт для каждого отношения базы данных, где пользователь может просматривать данные, и, кроме того, я хочу, чтобы они могли добавлять данные.

Для этого я использую wtforms. Я беру входные данные, создаю с ними простую «строку SQL» и выполняю ее. Чтобы упростить ввод, я хочу использовать динамические SelectFields.

Это мой подход:

@app.route('/table/fact_angestellte')
def fact_angestellte():
    if current_user.is_authenticated:
        mycursor.execute("SELECT * FROM dim_rolle WHERE ro_rolle !='Ansprechpartner' AND ro_rolle != 'Teilnehmer';")
        choicesRolle = mycursor.fetchall()
        form = InsertAngestelltenForm(choicesRolle)
        print(form.choicesRolle)
        mycursor.execute("SELECT * FROM fact_angestellte INNER JOIN dim_rolle ON fact_angestellte.an_rolle_fk = dim_rolle.ro_id_pk;")
        data = mycursor.fetchall()
        return render_template('tables/fact_angestellte.html', data=data, form=form)
    else:
        return redirect(url_for('login'))

Форма успешно создана, и если я попытаюсь напечатать form.choicesRolle (в приложении), она также даст мне правильный вывод в консоли. Но когда я захожу на свой веб-сайт, SelectField по-прежнему имеет значение по умолчанию selectionRolle.

class InsertAngestelltenForm(FlaskForm): 
    choicesRolle =[]
    nachname = StringField('Nachname', validators=[DataRequired()])
    vorname = StringField('Vorname',validators=[DataRequired()])
    geschlecht = SelectField('Geschlecht', choices=[('maennlich', 'männlich'), ('weiblich', 'weiblich')], validators=[DataRequired()])
    postleitzahl = StringField('Postleitzahl | FK', validators=[DataRequired()])
    strasse = StringField('Straße und Nummer', validators=[DataRequired()])
    rolle = SelectField('Rolle', choices=choicesRolle, validators=[DataRequired()])
    submit = SubmitField('Eintrag hinzufügen')

    def __init__(self, choicesRolle):
        super().__init__()
        self.choicesRolle = choicesRolle
        print(self.choicesRolle)

Итак, моя проблема: у объекта есть правильные атрибуты, но они почему-то не «доходят» до шаблона. Любая помощь приветствуется. Привет

Новые приложения с использованием ChatGPT
Новые приложения с использованием ChatGPT
Я собираюсь вернуться к теме, которую уже освещал ранее, - чатгпт.
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации WTForms, ключевое слово choices оценивается только один раз. В вашем примере это означает, что он оценивает пустой массив, который вы установили в атрибуте класса choicesRolle, и это то, что передается в Flask. Вам нужно установить выбор после создания формы, а не во время нее.

В классе формы удалите весь метод __init__, атрибут класса choicesRolle и параметр choices из rolle SelectField. Затем в функции просмотра fact_angestellte установите параметры формы после ее создания следующим образом:

choicesRolle = mycursor.fetchall()
form = InsertAngestelltenForm()
form.rolle.choices = choicesRolle

Это должно сработать... дайте мне знать. Обратите внимание, что я не уверен, какие данные возвращаются из mycursor.fetchall(), поскольку вы на самом деле не описываете, но выбор SelectField должен быть списком значений... WTForms по умолчанию приводит каждое значение к unicode.

Большое спасибо. Ваш ответ работает как шарм. Счастливых праздников! Оставайтесь в безопасности!

Lukas 20.12.2020 21:22

Другие вопросы по теме