динамический WTForms SelectField показывает заголовок столбца таблицы в БД - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь получить данные из SQL-таблицы 'School' с помощью sql-alchemy флакона в форму SelectField:

:

school_choices = [(School.id, School.name) for school in School.query.all()]
school = SelectField('Your school', validators=[DataRequired()], choices=school_choices)

маршруты:

def register():
if current_user.is_authenticated:
    return redirect(url_for('home'))
form = RegistrationForm()
if form.validate_on_submit():
    hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
    user = User(username=form.username.data, email=form.email.data, password=hashed_password, school=form.school.data)
    db.session.add(user)
    db.session.commit()
    flash('Your account has been created! You are now able to log in', 'success')
    return redirect(url_for('login'))
return render_template('register.html', title='Register', form=form)

модель:

class School(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)

Тем не менее, он каким-то образом отображает только «School.name», именно так, как оно написано в форме. Кроме того, правильное количество отображаемых записей (3, поскольку в базе данных есть 3 записи о школах)

1 Ответ

0 голосов
/ 04 ноября 2019

Проблема в вашем понимании списка, который строит значения для поля выбора и разницу между отображением атрибутов столбца в классе против экземпляра класса:

school_choices = [(School.id, School.name) for school in School.query.all()]

В приведенном выше понимании, вкаждый цикл school (нижний регистр 's') является экземпляром класса School (верхний регистр 'S').

В sqlalchemy - строковое представление атрибута столбца в классе (не экземпляркласс) возвращает идентификатор базы данных столбца, например: "<tablename>.<columnname>" или в этом случае "school.name". Так создаются запросы, например, попробуйте запустить print(School.__table__.select()), он выведет SELECT school.id, school.name FROM School. Идентификация столбцов в этом запросе происходит от «строкового преобразования» экземпляра Column.

Однако, когда мы получаем доступ к атрибуту столбца в экземпляре класса, например, school = School(name="myschool"), мы получаем значение столбца, который являетсяхранится в базе данных. Например, print(school.school) # myschool.

Глядя на свое понимание списка выше, вы создаете кортеж (School.id, School.name) для каждого экземпляра school в базе данных. Обратите внимание на заглавную букву 'S' для 'School', что означает, что вы в конечном итоге будете отображать строковое представление идентификатора базы данных вашего столбца для каждой школы в базе данных при визуализации вашего шаблона. Ответ так же прост, как изменение вашего понимания на:

school_choices = [(school.id, school.name) for school in School.query.all()]

... но понимание различия довольно важно при использовании sqlalchemy и python в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...