回顾一下开发流程:配置url, 编写视图函数,编写对应模板

  1. 配置URL
      • 首页视图匹配的 URL 去掉域名后,是一个空的字符串。每篇文章的详情有着不同的 URL,因此可以设计文章详情页面URl:<网站域名>/post/文章ID/ 时.下面依照这个规则来绑定 URL 和视图:

        # coding=utf8
        
        from django.conf.urls import url
        
        from .import views

        app_name = 'blog'
        urlpatterns = [
        url(r"^$", views.index, name="index"),
        url(r'^post/(?P<pk>[0-9]+/$)', views.detail, name='detal'),
        ]

        当用户访问 post/255/ 时, (?P<pk>[0-9]+) 会匹配255,并且传递关键字参数pk=255,给视图函数即:detail(request, pk=255)。?P<pk> 是 python 正则表达式的一个占位格式,表示其后匹配的内容将被存入键为 pk 的字典中。

      • 还添加了app_name = 'blog',告诉 Django 这个 urls.py 模块是属于 blog 应用的,这种技术叫做视图函数命名空间。区分不同应用中同名的视图函数
      • 给detail的url命名为detail
  2. 编写视图函数
    • # coding=utf8
      
      from django.shortcuts import render, get_object_or_404
      from .models import Post # Create your views here.
      def index(request):
      post_list = Post.objects.all().order_by('-create_time')
      return render(request, 'blog/index.html', context={'post_list': post_list}) def detail(request):
      # get_object_or_404当传入的pk对应的post数据存在时,就会返回post数据,否则返回404
      post = get_object_or_404(Post, pk=pk)
      return render(request, 'blog/detail.html', context={'post': post})
  3. 编写blog/detail.html
    • 先修改Index.html,让点击标题和继续阅读可以进入详情页面,即给标题和继续阅读添加一个超链接

                  {% for post in post_list %}
      <article class="post post-{{ post.pk }}">
      <header class="entry-header">
      <h1 class="entry-title">
      <!-- <a href="single.html">{{ post.title }}</a> -->
      <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
      </h1>
      <div class="entry-meta">
      <span class="post-category"><a href="#">{{ post.category.name }}</a></span>
      <span class="post-date"><a href="#"><time class="entry-date"
      datetime="{{ post.create_time }}">2017年5月11日</time></a></span>
      <span class="post-author"><a href="#">{{ post.author }}</a></span>
      <span class="comments-link"><a href="#">4 评论</a></span>
      <span class="views-count"><a href="#">588 阅读</a></span>
      </div>
      </header>
      <div class="entry-content clearfix">
      <p>{{ post.excerpt }}</p>
      <div class="read-more cl-effect-14">
      <!-- <a href="#" class="more-link">继续阅读 <span class="meta-nav">→</span></a> -->
      <a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav">→</span></a>
      </div>
      </div>
      </article>
      {% empty %}
      <div class="no-post">暂时还没有发布的文章!</div>
      {% endfor %}
    • 我们看到在blog/index.html有一个函数post.get_absolute_ur函数,函数属于post一个方法,得到文章详情页面的url . 因此在Post添加这个方法:
          # 自定义get_absolute_url方法,获取详情页面的绝对url
      # 需要 from django.urls import reverse
      def get_absolute_url(self):
      return reverse('blog:detail', kwargs={'pk': self.pk})
    • reverse('blog:detail', kwargs={'pk': self.pk})理解:请点我查看理解
  4. 重新插入数据
    >>> User.objects.all()
    <QuerySet [<User: myuser>]>
    >>> Tag.objects.all()
    <QuerySet [<Tag: tag_test>]>
    >>> Category.objects.all()
    <QuerySet [<Category: categroy_test>]>
    >>> user = User.objects.get(username='myuser')
    >>> t= Tag.objects.get(name='tag_test')
    >>> c = Category.objects.get(name='categroy_test')
    >>> p = Post(title='title_test', body='body_test_liuzhipeng', create_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
    >>> p.save()
    >>>
  5. 如果出现错误:
    NoReverseMatch at /
    Reverse for 'detail' with arguments '()' and keyword arguments '{'pk_id': 2}' not found. 1 pattern(s) tried:大部分是两个urls.py的错误,请认真排查

[python][django学习篇][12]继续设计博客首页,点击博客标题能显示文章的详情的更多相关文章

  1. [python][django学习篇][7]设计博客视图(1)

    1上网的流程: 打开浏览器,输入网址(http://zmrenwu.com/) 浏览器根据输入网址,完成以下几件事:1识别服务器地址,2将用户的浏览意图打包成一个http请求,发送给服务器,等待服务器 ...

  2. [python][django学习篇][9]设计正在博客视图(3)

    需求: 真正的首页视图函数,当用户访问我们的博客首页时,他将看到我们发表的博客文章列表,就像 演示项目 里展示的这样.t https://docs.djangoproject.com/en/1.10/ ...

  3. [python][django学习篇][3]创建django web的数据库模型

    推荐学习博客:http://pythonzh.cn/post/8/ 博客或者web界面向用户展示内容,它需要从某个地方获取博客内容或者web界面内容,才能够展示出来.通常来说:某个地方指的就是数据库 ...

  4. [python][django学习篇][5]选择数据库版本(默认SQLite3) 与操作数据库

    推荐学习博客:http://zmrenwu.com/post/6/ 选择数据库版本(SQLite3) 如果想选择MySQL等版本数据库,请先安装MySQL并且安装python mysql驱动,这里不做 ...

  5. [python][django学习篇[13]增加markdown_1

    1 进入虚拟环境,安装markdwon  python install markdown 2 修改视图函数detail def detail(request, pk): # get_object_or ...

  6. [python][django学习篇][8]django 视图(2) --简单模板

    在视图函数里返回的是一个 HttpResponse 类的实例,我们给它传入了一个希望显示在用户浏览器上的字符串.但是我们的博客不可能只显示这么一句话,它有可能会显示很长很长的内容.比如我们发布的博客文 ...

  7. [python][django学习篇][11]后台admin用户登录博客,添加文章---这一章和博客首页设计没有关系

    1 如果没有创建超级管理员账号,先要创建python manage.py createsuperuser 2 在admin后台注册模型(如果没有这一步,登录http://127.0.0.1:8000/ ...

  8. [python][django学习篇][15]博客侧栏--自定义模板标签

    我们的博客侧边栏有四项内容:最新文章.归档.分类和标签云. 这些内容相对比较固定,且在各个页面都会显示,如果像文章列表或者文章详情一样,从视图函数中获取然后传递给模板,则每个页面对应的视图函数里都要写 ...

  9. [python][django学习篇][10]再次修改博客首页模板

    目前我们看到的只是模板中预先填充的一些数据,我们得让它显示从数据库中获取的文章数据.下面来稍微改造一下模板: 删除所有article标签,然后添加以下内容,将从数据库读取到的内容填充到模板变量{{ p ...

随机推荐

  1. 梦织未来Windows驱动编程 第05课 小结(读取另一驱动,遍历所有驱动)

    读取另一驱动 驱动通过"\\Driver\\XueTr"获取到了XueTr工具的驱动,并Hook了XueTr驱动的分发函数. 具体的驱动代码如下: //FilterDriver.c ...

  2. Redis基础对象

    Redis 中每个对象都由一个 redisObject 结构表示 typedef struct redisObject { //类型 unsigned type:; //编码 unsigned enc ...

  3. android intent filter浏览器应用的设置,如何使用choose-box选择应用

    //使用chooserIntent private void startImplicitActivation() { Log.i(TAG, "Entered startImplicitAct ...

  4. django建议入门-FYI

    django 简易博客 现在正式开始博客开发 1安装官方发布版 官方发布的版本带有一个版本号,例如1.0.3或1.1,而最新版本总是可以在http://www.djangoproject.com/do ...

  5. iOS将大文件映射到内存(读取大文件)

    http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...

  6. 动态规划专题(四)——单调队列优化DP

    前言 单调队列优化\(DP\)应该还算是比较简单容易理解的吧,像它的升级版斜率优化\(DP\)就显得复杂了许多. 基本式子 单调队列优化\(DP\)的一般式子其实也非常简单: \[f_i=max_{j ...

  7. 简析平衡树(一)——替罪羊树 Scapegoat Tree

    前言 平衡树在我的心目中,一直都是一个很高深莫测的数据结构.不过,由于最近做的题目的题解中经常出现"平衡树"这三个字,我决定从最简单的替罪羊树开始,好好学习平衡树. 简介 替罪羊树 ...

  8. 梁勇 java教材 编程练习题 第二章 2.6 键盘 读取一个在0 到 9999 之间的整数,并将该整数的各位数字相加。

    import java.util.Scanner; /** * 需求:从键盘输入任意0~9999之间的整数,输出这个整数各位数字之和. * 思路:方法一,使用扫描器Scanner类,扫描控制台输入流 ...

  9. swl字符串

    创建字符串方法 去掉时间戳 #define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT ...

  10. MySQL基础 - 1 数据库基础

    一.数据库基础 1.什么是数据库 1.数据库(database)是保存有组织的数据的容器( 通常是一个文件或一组文件 ) 2.数据库是一个以某种有组织的方式存储的数据集合 注意:数据库软件应该称为DB ...