好的,这是我的第一个烧瓶答案(我昨天才完成教程):
编辑/信息:最后我没有使用任何形式来完成这个,只是简单的路线,但也可以使用形式,这似乎更简单(更多是因为我不知道如何为此使用这些表格:))
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 语句并使用该变量处理帖子的排序方式
然后按该顺序返回包含这些帖子的模板
现在关于模板
首先它使用引导程序,我从那里获得了最多的代码(只是从他们的网站复制粘贴)或here,这是一个很好的备忘单。
所以我从该备忘单中复制了下拉菜单并更改了一些值,最值得注意的是href 属性:
我用url_for 函数替换了那些函数并传递了变量,如您所见,发送的请求带有允许处理帖子排序方式的变量
希望一切都清楚,如果您还有任何问题,请提出。