Как отобразить следующую запись в базе данных, нажав кнопку во Flask? - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать приложение Flask, которое будет отображать в заголовке последовательности и в содержании статей, хранящихся в базе данных, нажав кнопку «Далее», но я не знаю, что я должен делать ниже первой «если», чтобы получить статистику только одна запись из базы данных. Мои текущие решения приводят к ошибке: sqlalchemy.orm.exc.MultipleResultsFound: Multiple rows were found for one()

Вот мой код:

flask import Flask, render_template, url_for, request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////PATH/TO/DATABASE/KORPUS/Database.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class Polityka(db.Model):
    __tablename__ = 'polityka_articles'
    id = db.Column('id', db.Integer, primary_key=True)
    title = db.Column('article_title', db.Unicode)
    content = db.Column('article_content', db.Unicode)

@app.route('/', methods=['GET', 'POST'])

def index():

    next_item = request.form.get('next_item')
    data = Database.query.filter_by(column = 'Nauka').first()

    if next_item is not None:
        data = Polityka.query.filter_by(column = 'Nauka').one()
    return render_template('home.html', item_title = data.title, item_content = data.content)


if __name__ == '__main__':
    app.run(debug=True)

А вот и home.html файл:

<!DOCTYPE html>
<html>
<head>
    <!-- Required meta tag and CSS -->
    <title>Site</title>
</head>
<body>
    <div class='container'>

        <h1>{{ item_title }}</h1>
        <p>{{ item_content }}</p>

    </div>
    <form method="POST" action="/">
        <button type="submit" name="next_item" class="btn btn-success">Next</button>
    </form>
</body>
</html>

Я буду рад любым подсказкам.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вам нужно будет передать индекс в форму, а затем использовать этот индекс для offset. Возможно, вам также нужно добавить orderby, но я не включил это здесь. Примерно так:

def index():
    next_item = request.form.get('next_item')
    next_item_index = int(request.form.get('next_item_index', 0))
    data = db.query(column='Nauka').offset(next_item_index).limit(1).all()[0]
    return render_template('home.html',
        data=data,
        next_item_index=next_item_index + 1)

И в вашем HTML:

<div class="container">
    <h1>{{ data.title }}</h1>
    <p>{{ data.content }}</p>
</div>
<form method="POST" action="/">
    <input type="hidden" name="next_item_index" value="{{ next_item_index }}">
    <button type="submit" name="next_item" class="btn btn-success">Next</button>
</form>

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

0 голосов
/ 31 августа 2018

one() ожидает, что будет возвращена только одна запись, в противном случае возникнет исключение.

first() вернет первую доступную строку, если нет, то вернет None

all() вернет все, что вы запрашивали

заменить one() -> first() или all()[0]

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