[python][django学习篇][12]继续设计博客首页,点击博客标题能显示文章的详情
回顾一下开发流程:配置url, 编写视图函数,编写对应模板
- 配置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
- 编写视图函数
# 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})
- 编写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})理解:请点我查看理解
- 先修改Index.html,让点击标题和继续阅读可以进入详情页面,即给标题和继续阅读添加一个超链接
- 重新插入数据
>>> 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()
>>> - 如果出现错误:
NoReverseMatch at /
Reverse for 'detail' with arguments '()' and keyword arguments '{'pk_id': 2}' not found. 1 pattern(s) tried:大部分是两个urls.py的错误,请认真排查
[python][django学习篇][12]继续设计博客首页,点击博客标题能显示文章的详情的更多相关文章
- [python][django学习篇][7]设计博客视图(1)
1上网的流程: 打开浏览器,输入网址(http://zmrenwu.com/) 浏览器根据输入网址,完成以下几件事:1识别服务器地址,2将用户的浏览意图打包成一个http请求,发送给服务器,等待服务器 ...
- [python][django学习篇][9]设计正在博客视图(3)
需求: 真正的首页视图函数,当用户访问我们的博客首页时,他将看到我们发表的博客文章列表,就像 演示项目 里展示的这样.t https://docs.djangoproject.com/en/1.10/ ...
- [python][django学习篇][3]创建django web的数据库模型
推荐学习博客:http://pythonzh.cn/post/8/ 博客或者web界面向用户展示内容,它需要从某个地方获取博客内容或者web界面内容,才能够展示出来.通常来说:某个地方指的就是数据库 ...
- [python][django学习篇][5]选择数据库版本(默认SQLite3) 与操作数据库
推荐学习博客:http://zmrenwu.com/post/6/ 选择数据库版本(SQLite3) 如果想选择MySQL等版本数据库,请先安装MySQL并且安装python mysql驱动,这里不做 ...
- [python][django学习篇[13]增加markdown_1
1 进入虚拟环境,安装markdwon python install markdown 2 修改视图函数detail def detail(request, pk): # get_object_or ...
- [python][django学习篇][8]django 视图(2) --简单模板
在视图函数里返回的是一个 HttpResponse 类的实例,我们给它传入了一个希望显示在用户浏览器上的字符串.但是我们的博客不可能只显示这么一句话,它有可能会显示很长很长的内容.比如我们发布的博客文 ...
- [python][django学习篇][11]后台admin用户登录博客,添加文章---这一章和博客首页设计没有关系
1 如果没有创建超级管理员账号,先要创建python manage.py createsuperuser 2 在admin后台注册模型(如果没有这一步,登录http://127.0.0.1:8000/ ...
- [python][django学习篇][15]博客侧栏--自定义模板标签
我们的博客侧边栏有四项内容:最新文章.归档.分类和标签云. 这些内容相对比较固定,且在各个页面都会显示,如果像文章列表或者文章详情一样,从视图函数中获取然后传递给模板,则每个页面对应的视图函数里都要写 ...
- [python][django学习篇][10]再次修改博客首页模板
目前我们看到的只是模板中预先填充的一些数据,我们得让它显示从数据库中获取的文章数据.下面来稍微改造一下模板: 删除所有article标签,然后添加以下内容,将从数据库读取到的内容填充到模板变量{{ p ...
随机推荐
- adc verilog spi 时序
我用的是adc081sd芯片,(由于我们使用的是FPGA不用像单片机那样考虑极性cpol,相位cpha,下面仅仅介绍下跟单片机比较下) 什么是cpol:若cs被拉为低电平时sclk(时钟)是高那么cp ...
- Coursera 算法二 week2 Seam Carving
这周作业设计到的算法是有向无环图的最短路径算法,只需要按照顶点的拓扑顺序去放松顶点即可.而在这个题目中拓扑顺序就是按照行的顺序或列的顺序. 用到的数据结构为一个二维数组picture同来存储每个像素的 ...
- swift 命名空间实现的设计思考:extension YKKit where Base == String
设计问题:谁来构造.构造什么.怎么添加新功能 关键词:本体.客体.构造.映射.功能. 别名:桥接变量.型变变量.容器变量.适配变量,构造变量: 目的:添加命名空间.添加新功能. 原则:不修改本体的实现 ...
- 【洛谷2279】[HNOI2003] 消防局的设立(贪心)
点此看题面 大致题意: 给你\(N\)个点(其中\(1\)号点为根),并告诉你编号为\(2\sim N\)的点的父亲(\(fa[i]<i\)),现在要在树上选择尽量少的关键点(消防局),使得任意 ...
- 求和VII
问题 K: 求和VII 时间限制: 2 Sec 内存限制: 256 MB提交: 422 解决: 53[提交] [状态] [讨论版] [命题人:admin] 题目描述 master对树上的求和非常感 ...
- python脚本执行报错:SyntaxError: Non-ASCII character '\xe6' in file ip.py on line 4...
报错信息 [root@chenbj ~]# python ip.py 192.168.1.1 File "ip.py", line 4 SyntaxError: Non-ASCII ...
- 高级vim 配置
[root@chenbj ~]# pwd /root [root@chenbj ~]# cat .vimrc set nocompatible set pastetoggle=<F9> s ...
- SOA架构设计案例分析
转载自:https://www.jdon.com/soa.html 首先Martin Fowler提出SOA歧义Service Oriented Ambiguity,认为"什么是SOA&qu ...
- RuPengGame游戏引擎 精灵 createSprite 创建 setSpritePosition 设置位置 playSpriteAnimate 播放动画 setSpriteFlipX设置翻转 精灵图片下载地址
package com.swift; import java.awt.Point; import com.rupeng.game.GameCore;//导入游戏引擎包 public class Gam ...
- SummerVocation_Learning--java的多线程实现
java的线程是通过java.lang.Thread类来实现的. 可以通过创建Thread的实例来创建新的线程. 每个线程都是通过某个特定Thread对象所对应的方法run()来完成操作,方法run( ...