给文章标题加链接

  1. 打开 blog/templates/blog/post_list.html
  2. 修改 ```

    {{ post.title }}

  1. 3.

{{ post.title }}

  1. **解释:** `{% url 'post_detail' pk=post.pk %}`<br />`{% %}`标记意味着我们正在使用Django模板标签,
  2. ## 创建文章详情页面的URL
  3. `urls.py`里为我们的 `post_detail` _view_ 创建一个URL!<br />我们希望我们的第一条文章详细页面显示在类似这样的**URL**:

http://127.0.0.1:8000/post/1/

  1. **增加URL urls.py**<br />在 `blog/urls.py` 文件中增加一个 URL 来指引 Django 到名为 `post_detail` _view_,它将用来显示整篇博客文章。

url(r’^post/(?P[0-9]+)/$’, views.post_detail, name=’post_detail’),

  1. > 增加以上内容,到 urlpatterns = [ `这里面` ]
  2. 修改后,内容如下<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)
  3. ## 增长文章详情页面的视图
  4. 从上面的报错可以发现,blog.views里面没有post_detail 所以我们这次要往blog.views里面加上post_detail。<br />**pk** 是用来处理 404 页面的。<br />现在,我们想要有一个并且只有一个博客帖子。为了做到这一点,我们需要使用下面的请求集合:
  1. Post.objects.get(pk=pk)
  1. 但是这段代码有一个问题。如果没有`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` 并添加以下代码:
  1. from django.shortcuts import render, get_object_or_404
  1. `from`附近 行。并在文件的末尾,我们将增加我们的 _view_

def post_detail(request, pk): post = get_object_or_404(Post, pk=pk) return render(request, ‘blog/post_detail.html’, {‘post’: post})

  1. **但是我们点击文章链接会出现**<br />![20170827150383085775245.png](http://7.feilongs.com/20170827150383085775245.png)
  2. ## 为文章详情页面增加模板
  3. > 出现上面的问题是因为 我们只增加了views和链接,但是没有增加文字详情页的模板文件导致的。
  4. `blog/templates/blog` 中创建一个文件,叫做 `post_detail.html`<br />**我们需要用到 base.html**
  5. 1.
  6. 调用 base.html文件 `{% extends 'blog/base.html' %}`
  7. 1.
  8. 增加 block 模块 `{% block content %} {% endblock %}`
  9. 1.
  10. 由于我们只是显示一篇文章,所以不需要for 循环直接加上,就可以显示文章的标题的内容
  1. <div class="post">
  2. <h1>{{ post.title }}</h1>
  3. <p>{{ post.text|linebreaksbr }}</p>
  4. </div>
  1. 1.
  2. `{% if ... %} ... {% endif %}` 是当我们想检查某样东西(还记得Python简介里的 if ... else ... 吗?)的时候的一种模板记号 在这个例子中,我们想要检查文章的 `published_date` 不是空的。
  1. {% if post.published_date %}
  2. <div class="date">
  3. {{ post.published_date }}
  4. </div>
  5. {% endif %}
  1. 这个是为了显示这个时间用的。
  2. <br />![20170827150383166276158.png](http://7.feilongs.com/20170827150383166276158.png)
  3. ## 部署上线
  4. ### 上传到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

  1. ### 在 PythonAnywhere 从 Github 拉取代码
  1. $ cd my-first-blog
  2. $ source myvenv/bin/activate
  3. (myvenv)$ git pull
  4. [...]
  5. (myvenv)$ python manage.py collectstatic
  6. [...]

```

  • 最后reload