给文章标题加链接
- 打开
blog/templates/blog/post_list.html
- 修改
```
{{ post.title }}
3. 为
{{ post.title }}
**解释:** `{% url 'post_detail' pk=post.pk %}`<br />`{% %}`标记意味着我们正在使用Django模板标签,
## 创建文章详情页面的URL
在`urls.py`里为我们的 `post_detail` _view_ 创建一个URL!<br />我们希望我们的第一条文章详细页面显示在类似这样的**URL**:
**增加URL 到 urls.py**<br />在 `blog/urls.py` 文件中增加一个 URL 来指引 Django 到名为 `post_detail` 的 _view_,它将用来显示整篇博客文章。
url(r’^post/(?P
> 增加以上内容,到 urlpatterns = [ `这里面` ]
修改后,内容如下<br />![20170827150382824143625.png](http://7.feilongs.com/20170827150382824143625.png)<br />**解释: `^post/(?P<pk>[0-9]+)`**<br />`^`表示开头<br />`post/` 表示到 post/结束<br />`()`里面是匹配的内容<br />`[0-9]`也告诉我们它只能由数字,而不是字母(所以是取值范围是介于0和9之间)。 `+` 意味着需要一个或更多的数字。<br />`pk` 是 `primary key(主键)`的缩写。他是一个变量,在前面标题的链接是 pk.post.pk。 在Django项目中常常用到这个名字。 但是你可以使用你想要的变量(记住:使用小写以及`_`而不是空格!)。 比如与其说 `(?P<pk>[0-9]+)` 我们可以有`post_id`, 所以这个就像: `(?P<post_id>[0-9]+)`<br />**这个时候查看网页会报错**<br />![20170827150382986380066.png](http://7.feilongs.com/20170827150382986380066.png)
## 增长文章详情页面的视图
从上面的报错可以发现,blog.views里面没有post_detail 所以我们这次要往blog.views里面加上post_detail。<br />**pk** 是用来处理 404 页面的。<br />现在,我们想要有一个并且只有一个博客帖子。为了做到这一点,我们需要使用下面的请求集合:
Post.objects.get(pk=pk)
但是这段代码有一个问题。如果没有`Post`和给定`主键`(`pk`)我们将有一个非常丑陋的错误!<br />![20170827150383049616962.png](http://7.feilongs.com/20170827150383049616962.png)<br />加上了就会显示 404,就正常了,没有的文字页面显示404,这很科学。我们不希望那样! 但是,当然,Django已经为我们处理好了这些:`get_object_or_404`。 万一没有`Post`和给定的`pk`,它将展现更多有趣的页面(称作`Page Not Found 404`页面)。<br />![20170827150383055692806.png](http://7.feilongs.com/20170827150383055692806.png)<br />这面这个是为 这个404服务的。<br />![20170827150383069850813.png](http://7.feilongs.com/20170827150383069850813.png)<br />**好吧,是时候将 _视图_ 添加到我们的 `views.py` 文件了!**<br />我们应该打开 `blog/views.py` 并添加以下代码:
from django.shortcuts import render, get_object_or_404
在 `from`附近 行。并在文件的末尾,我们将增加我们的 _view_:
def post_detail(request, pk): post = get_object_or_404(Post, pk=pk) return render(request, ‘blog/post_detail.html’, {‘post’: post})
**但是我们点击文章链接会出现**<br />![20170827150383085775245.png](http://7.feilongs.com/20170827150383085775245.png)
## 为文章详情页面增加模板
> 出现上面的问题是因为 我们只增加了views和链接,但是没有增加文字详情页的模板文件导致的。
在`blog/templates/blog` 中创建一个文件,叫做 `post_detail.html`<br />**我们需要用到 base.html**
1.
调用 base.html文件 `{% extends 'blog/base.html' %}`
1.
增加 block 模块 `{% block content %} {% endblock %}`
1.
由于我们只是显示一篇文章,所以不需要for 循环直接加上,就可以显示文章的标题的内容
<div class="post">
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
1.
`{% if ... %} ... {% endif %}` 是当我们想检查某样东西(还记得Python简介里的 if ... else ... 吗?)的时候的一种模板记号 。 在这个例子中,我们想要检查文章的 `published_date` 不是空的。
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
这个是为了显示这个时间用的。
<br />![20170827150383166276158.png](http://7.feilongs.com/20170827150383166276158.png)
## 部署上线
### 上传到GitHub
$ git status $ git add —all . $ git status $ git commit -m “Added view and template for detailed blog post as well as CSS for the site.” $ git push
### 在 PythonAnywhere 从 Github 拉取代码
$ cd my-first-blog
$ source myvenv/bin/activate
(myvenv)$ git pull
[...]
(myvenv)$ python manage.py collectstatic
[...]
```
- 最后reload