文章详情页

给文章标题加链接

  1. 打开 blog/templates/blog/post_list.html
  2. 修改
<h1><a href="">{{ post.title }}</a></h1>
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>

解释: {% url 'post_detail' pk=post.pk %}

{% %}标记意味着我们正在使用Django模板标签,

创建文章详情页面的URL

urls.py里为我们的 post_detail view 创建一个URL!

我们希望我们的第一条文章详细页面显示在类似这样的URL

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

增加URL 到 urls.py

blog/urls.py 文件中增加一个 URL 来指引 Django 到名为 post_detailview,它将用来显示整篇博客文章。

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

增加以上内容,到 urlpatterns = [ 这里面 ]

修改后,内容如下

20170827150382824143625.png

解释: ^post/(?P<pk>[0-9]+)

^表示开头

post/ 表示到 post/结束

()里面是匹配的内容

[0-9]也告诉我们它只能由数字,而不是字母(所以是取值范围是介于0和9之间)。 + 意味着需要一个或更多的数字。

pkprimary key(主键)的缩写。他是一个变量,在前面标题的链接是 pk.post.pk。 在Django项目中常常用到这个名字。 但是你可以使用你想要的变量(记住:使用小写以及_而不是空格!)。 比如与其说 (?P<pk>[0-9]+) 我们可以有post_id, 所以这个就像: (?P<post_id>[0-9]+)

这个时候查看网页会报错

20170827150382986380066.png

增长文章详情页面的视图

从上面的报错可以发现,blog.views里面没有post_detail 所以我们这次要往blog.views里面加上post_detail。

pk 是用来处理 404 页面的。

现在,我们想要有一个并且只有一个博客帖子。为了做到这一点,我们需要使用下面的请求集合:

    Post.objects.get(pk=pk)

但是这段代码有一个问题。如果没有Post和给定主键pk)我们将有一个非常丑陋的错误!

20170827150383049616962.png

加上了就会显示 404,就正常了,没有的文字页面显示404,这很科学。我们不希望那样! 但是,当然,Django已经为我们处理好了这些:get_object_or_404。 万一没有Post和给定的pk,它将展现更多有趣的页面(称作Page Not Found 404页面)。

20170827150383055692806.png

这面这个是为 这个404服务的。

20170827150383069850813.png

好吧,是时候将 视图 添加到我们的 views.py 文件了!

我们应该打开 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})

但是我们点击文章链接会出现

20170827150383085775245.png

为文章详情页面增加模板

出现上面的问题是因为 我们只增加了views和链接,但是没有增加文字详情页的模板文件导致的。

blog/templates/blog 中创建一个文件,叫做 post_detail.html

我们需要用到 base.html

  1. 调用 base.html文件 {% extends 'blog/base.html' %}

  2. 增加 block 模块 {% block content %} {% endblock %}

  3. 由于我们只是显示一篇文章,所以不需要for 循环直接加上,就可以显示文章的标题的内容

           <div class="post">
               <h1>{{ post.title }}</h1>
               <p>{{ post.text|linebreaksbr }}</p>
           </div>
  4. {% if ... %} ... {% endif %} 是当我们想检查某样东西(还记得Python简介里的 if ... else ... 吗?)的时候的一种模板记号 。 在这个例子中,我们想要检查文章的 published_date 不是空的。

       {% if post.published_date %}
           <div class="date">
               {{ post.published_date }}
           </div>
       {% endif %}

    这个是为了显示这个时间用的。

    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
Comments
Write a Comment