用Flask创建一个博客
我正在学习烧瓶,我有一个小问题。 我做了一个索引模板,其中有博客文章标题。
{% for title in titles %}
<!-- Main Content -->
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<div class="post-preview">
<a href="{{ url_for('post')}}">
<h2 class="post-title">
{{ title[0] }}
</h2>
</a>
<p class="post-meta">Posted by <a href="#">{{ author }}</a></p>
</div>
</div>
</div>
</div>
{% endfor %}
这是我的post.html模板的一部分。
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<p>{{ post_text1 | safe }}</p>
<hr>
<div class="alert alert-info" role="alert">Posted by
<a href="#" class="alert-link">{{ author }}</a>
</div>
</div>
</div>
</div>
我正在使用sqlite3。 目前每个标题都会导致相同的post.html,其中第一个帖子是第一个文本。 如何使每个标题直接发布到他们的文章中? 我的意思是,如果我点击第一个标题,它应该显示post.html,并且应该有第一个文本。 第二个标题应显示第二个文本。 我应该编写程序,为每个帖子创建新的html还是有其他方法?
@app.route('/')
def index():
db = connect_db()
titles = db.execute('select title from entries')
titles = titles.fetchall()
author = db.execute('select author from entries order by id desc')
author = author.fetchone()
return render_template('index.html', titles=titles[:], author=author[0])
@app.route('/post/')
def post():
db = connect_db()
post_text1 = db.execute('select post_text from entries')
post_text1 = post_text1.fetchone()
author = db.execute('select author from entries where id=2')
author = author.fetchone()
return render_template('post.html', post_text1=post_text1[0], author=author[0])
问题来自这里<a href="{{ url_for('post')}}">
。
这个告诉Flask的是为post创建一个url,这是你在视图中定义为def post(argument)
但是你没有提供参数。 因此,例如,如果你让你基于id来发帖,你的视图会要求在/<int:post_id>/
url中包含/<int:post_id>/
,并且post_id
将作为参数传递,根据这个参数你可以找到特定的帖子并通过那到模板。
你的url_for
应该反映这一点,你应该有{{ url_for('post', post_id=title[1]) }}
或者无论你在哪里存储你的post_id(也许这是你的标题)的等价物。
编辑:
在你编辑的时候,你的问题是你没有告诉Flask要获取哪个帖子。 您需要ID或slug,或者将会在网址中显示的内容,并会告诉您您正在查找的帖子。 您的功能现在是静态的,并且总是获取数据库中的第一个条目。 所需的更改是:
@app.route('/')
def index():
db = connect_db()
titles = db.execute('select title, id from entries')
titles = titles.fetchall()
author = db.execute('select author from entries order by id desc')
author = author.fetchone()
return render_template('index.html', titles=titles, author=author[0])
@app.route('/post/<int:post_id>/')
def post(post_id):
db = connect_db()
post_text = db.execute('select post_text from entries where id = ?', post_id)
post_text = post_text1.fetchone()
author = db.execute('select author from entries where id=2')
author = author.fetchone()
return render_template('post.html', post_text1=post_text, author=author)
<a href="{{ url_for('post', post_id=title[1])}}">
您的作者提取也很奇怪,您应该在条目旁边存储它们(至少是它们的ID)。 然后我会推荐一些命名更改等。很难只回答问题,也不会为您写代码,因为这是回答特定问题的网站,而不是按需编写代码:)尝试理解我在此处写的内容,多玩一些等等,完全没有意义。
tl; dr:帖子必须得到一个参数,然后获取由该参数标识的帖子,该程序不能奇迹般地分辨您点击了哪个帖子。
链接地址: http://www.djcxy.com/p/61759.html