Вопрос:

Невозможно записать данные в базу данных в колбу

sqlite flask

38 просмотра

1 ответ

6 Репутация автора

Я работаю над небольшим приложением для отслеживания чтения во Flask. Я не могу записать данные с одного из моих маршрутов ниже:

@app.route('/add_book', methods=['GET', 'POST'])
@login_required
def add_book():
    form=BookForm()
    if request.method=='POST':
        if form.validate_on_submit():
            book=Book(
                title=form.title.data,
                author=form.author.data,
                # category=form.category.data,
                # added_on=form.added_on.data,
                # done=form.done.data,
                user_id=current_user
                )

            db.session.add(book)
            db.session.commit()
            flash('Book added')
            return redirect(url_for('books'))
        else:
            flash('ERROR. The book not added.')

    return render_template('add_book.html', form=form)

Это соответствующий HTML:

{% extends "layout.html" %}

{% block content %}

{% if form %}

    <form action="{{ url_for('add_book') }}" method="post">
      {{ form.hidden_tag() }}

        {{ form.title.label }}<br>
        {{ form.title() }}<br>

        {{ form.author.label }}<br>
        {{ form.author(cols=32, rows=4) }}<br>

       <!-- {{ form.category.label }}<br>
        {{ form.category() }}<br> -->

        {{ form.submit() }}

    </form>

    {% endif %}

{% endblock %}

Когда страница отображается, появляются метка и формы для книги и автора, однако при нажатии кнопки «Отправить» данные не сохраняются.

Раздел кода похож на тот, что используется для регистрации пользователя, и я застрял на том, что делать, потому что я не вижу никаких ошибок. Я использую SQLite в качестве базы данных.

Вот модель книги:

class Book(db.Model):

    __tablename__='books'

    id=db.Column(db.Integer, primary_key=True)
    title=db.Column(db.String(100))
    author=db.Column(db.String(50))
    # category=db.Column(db.String(50))
    added_on=db.Column(db.DateTime, index=True, default=datetime.utcnow)
    done=db.Column(db.Boolean, default=False)
    user_id=db.Column(db.Integer, db.ForeignKey('users.id'))

    def __init__(self, title, author, added_on, done, user_id):
        self.title=title
        self.author=author
        self.added_on=added_on
        self.done=done
        self.user_id=user_id

    def __repr__(self):
        # return '<Book: Title - {0}, Author - {1}, Category - {2}>'.format(self.title, self.author, self.category)
        return '<Book: Title - {0}, Author - {1}>'.format(self.title, self.author)
Автор: marundu Источник Размещён: 19.02.2019 03:36

Ответы (1)


0 плюса

421 Репутация автора

Current_user - это пользовательский прокси-сервер, который предоставляет доступ ко всем атрибутам пользователя или использует что-то вроде этого. Как отследить текущего пользователя в flask-login?

быстрое решение было бы изменить эту строку

user_id = current_user

в это

user_id = current_user.id

Обновление: хорошо, я получил это работает. Вам нужны следующие исправления, каждое из которых приводит к проблемам с проверкой формы и фиксацией в базе данных: - используйте current_user.id в объекте книги, как я уже говорил ранее. - удален метод инициализации в книжной модели. Я не уверен, какова добавленная стоимость в данный момент, я получаю сообщения об ошибках о полях, добавленных и заполненных, которых нет в форме. Я не нашел время, чтобы разобраться в этом дальше. - просто перейдите, если request.method == 'POST', так как вам не нужны оба. Форма будет проверена на валидацию в любом случае.

Совет: не забудьте создать файл требований (pip freeze -> needs.txt), который значительно упростит переустановку в новой виртуальной среде.

Автор: gittert Размещён: 20.02.2019 07:50
Вопросы из категории :
32x32