В настоящее время я работаю над веб-приложением «исследователь базы данных» для университетского проекта. В основном я создаю сайт для каждого отношения базы данных, где пользователь может просматривать данные, и, кроме того, я хочу, чтобы они могли добавлять данные.
Для этого я использую 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)
Итак, моя проблема: у объекта есть правильные атрибуты, но они почему-то не «доходят» до шаблона. Любая помощь приветствуется. Привет
Согласно документации 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.
Большое спасибо. Ваш ответ работает как шарм. Счастливых праздников! Оставайтесь в безопасности!