簡體   English   中英

從flask中的html模板訂購查詢數據

[英]Ordering query data from html template in flask

我正在使用時間對查詢結果進行排序,但我想讓用戶能夠選擇他想要對數據進行排序的方式可以說他想使用字母順序或者他想以升序或降序排序我想知道如何那個在燒瓶里,對不起我的英語不好

這是我的代碼

@routes.route('/posts')
def show_posts():
    page=request.args.get('page',1,type=int)
    posts=Posts.query.order_by(Posts.timestamp.desc).paginate(page,per_page=10)
    return render_template('routes/show_posts.html',posts=posts)

好的,這是我的第一個燒瓶答案(我昨天才完成教程):

編輯/信息:最后我沒有使用任何表格來完成這個,只是簡單的路線,但也可以使用表格,這看起來更簡單一些(更多是因為我無法弄清楚如何使用這些表格為了這 :))

EDIT2/INFO:我也不認為對於這個特定的代碼,裝飾器中的methods參數有任何需要,因此可以為這個特定的代碼刪除它

主文件(它包含所有內容,因為這比顯示我將使用的每個模塊更容易)

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


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'

db = SQLAlchemy(app)


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)


@app.route('/posts/filter_by/<string:key>')
@app.route('/posts', methods=['GET', 'POST'])
@app.route('/')
def all_posts(key=None):
    posts = Post.query.order_by(Post.title.asc()).all()
    if key == 'ZA':
        posts = Post.query.order_by(Post.title.desc()).all()
    return render_template('posts.html', posts=posts)


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

這是模板(使用引導程序):

<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

    <title>Hello, world!</title>
  </head>
  <body>

    <div class="dropdown">
      <button class="btn btn-secondary dropdown-toggle"
              type="button" id="dropdownMenu1" data-toggle="dropdown"
              aria-haspopup="true" aria-expanded="false">
        Sort by
      </button>
      <div class="dropdown-menu" aria-labelledby="dropdownMenu1">
        <a class="dropdown-item" href="{{ url_for('all_posts', key='AZ') }}">A-Z</a>
        <a class="dropdown-item" href="{{ url_for('all_posts', key='ZA') }}">Z-A</a>
      </div>
    </div>

    {% for post in posts %}
        <div class="card">
            <div class="card-body">
                <h4 class="card-title">{{ post.title }}</h4>
                <p class="card-text">{{ post.content }}</p>
            </div>
        </div>
    {% endfor %}

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
  </body>
</html>

所以第一件事(自上而下):

導入所有需要的東西
然后初始化 Flask 和 SQLAlchemy 類並將應用程序配置到數據庫

創建用於存儲帖子和內容的帖子模型(我不完全知道)

然后是主要部分 - 路線。

所以首先我創建一個帶有變量的路由:

@app.route('/posts/filter_by/<string:key>')

這將允許請求此 URL 並能夠獲取有助於處理響應的其他信息(來自該變量)

然后添加更多路由,使 url 看起來更干凈,這幾乎是唯一的原因(據我所知)

然后定義函數:
將其命名為您喜歡的名稱,但您必須將該變量作為參數傳遞,並且由於使用了多個路由,並且可能出於其他原因也為該參數設置了默認值,以便不必提供它

然后使用簡單的 if 語句並使用該變量處理帖子的排序方式

然后按順序返回包含這些帖子的模板

現在關於模板

首先它使用引導程序,我從那里獲得了最多的代碼(只是從他們的網站復制粘貼)或這里是一個不錯的備忘單。

所以我從那個備忘單中復制了下拉菜單,只是改變了一些值,最顯着的是href屬性:

我用url_for函數替換並傳遞了變量,如您所見,以便發送的請求與該變量一起使用,該變量將允許處理帖子的排序方式

希望一切都清楚,如果您還有任何問題,請詢問他們。

首先,Matiiss 您的回答非常好,感謝您的幫助,現在我找到了另一種方式,它與 Matiiss 的回答有一些相似之處,我想分享它,所以如果有人發現這個問題,現在您必須從中選擇答案。

@routes.route('/posts')
def show_posts():
    posts= Posts.query.order_by(Posts.name.desc()).all()
    filter_rule = request.args.get('filter')
    if filter_rule == 'A-Z':
        posts= Posts.query.order_by(Posts.name).all()
    return render_template('posts.html',posts=posts)

HTML部分

<div class="row">
        <div class="col-md-3">
            <div class="nav nav-pills flex-column" role="tablist" aria-orientation="vertical">
                <a class="nav-item nav-link"
                   href="{{ url_for('.show_posts', filter='A-Z') }}">
                    A-Z
                </a>
                <a class="nav-item nav-link"
                   href="{{ url_for('.show_posts', filter='Z-A') }}">
                    Z-A
                </a>
            </div>
        </div>

這讓我有點驚訝,我可以將變量傳遞給我的燒瓶路線,而無需在路線中聲明它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM