3.1.分页功能

(1)views.py

from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

def make_paginator(objects, page, num=3):
paginator = Paginator(objects, num)
try:
object_list = paginator.page(page)
except PageNotAnInteger:
object_list = paginator.page(1)
except EmptyPage:
object_list = paginator.page(paginator.num_pages)
return object_list, paginator def pagination_data(paginator, page):
"""
用于自定义展示分页页码的方法
:param paginator: Paginator类的对象
:param page: 当前请求的页码
:return: 一个包含所有页码和符号的字典
"""
if paginator.num_pages == 1:
# 如果无法分页,也就是只有1页不到的内容,则无需显示分页导航条,不用任何分页导航条的数据,因此返回一个空的字典
return {}
# 当前页左边连续的页码号,初始值为空
left = [] # 当前页右边连续的页码号,初始值为空
right = [] # 标示第 1 页页码后是否需要显示省略号
left_has_more = False # 标示最后一页页码前是否需要显示省略号
right_has_more = False # 标示是否需要显示第 1 页的页码号。
# 因为如果当前页左边的连续页码号中已经含有第 1 页的页码号,此时就无需再显示第 1 页的页码号,
# 其它情况下第一页的页码是始终需要显示的。
# 初始值为 False
first = False # 标示是否需要显示最后一页的页码号。
# 需要此指示变量的理由和上面相同。
last = False # 获得用户当前请求的页码号
try:
page_number = int(page)
except ValueError:
page_number = 1
except:
page_number = 1 # 获得分页后的总页数
total_pages = paginator.num_pages # 获得整个分页页码列表,比如分了四页,那么就是 [1, 2, 3, 4]
page_range = paginator.page_range if page_number == 1:
# 如果用户请求的是第一页的数据,那么当前页左边的不需要数据,因此 left=[](已默认为空)。
# 此时只要获取当前页右边的连续页码号,
# 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 right = [2, 3]。
# 注意这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
right = page_range[page_number:page_number + 4] # 如果最右边的页码号比最后一页的页码号减去 1 还要小,
# 说明最右边的页码号和最后一页的页码号之间还有其它页码,因此需要显示省略号,通过 right_has_more 来指示。
if right[-1] < total_pages - 1:
right_has_more = True # 如果最右边的页码号比最后一页的页码号小,说明当前页右边的连续页码号中不包含最后一页的页码
# 所以需要显示最后一页的页码号,通过 last 来指示
if right[-1] < total_pages:
last = True elif page_number == total_pages:
# 如果用户请求的是最后一页的数据,那么当前页右边就不需要数据,因此 right=[](已默认为空),
# 此时只要获取当前页左边的连续页码号。
# 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 left = [2, 3]
# 这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1] # 如果最左边的页码号比第 2 页页码号还大,
# 说明最左边的页码号和第 1 页的页码号之间还有其它页码,因此需要显示省略号,通过 left_has_more 来指示。
if left[0] > 2:
left_has_more = True # 如果最左边的页码号比第 1 页的页码号大,说明当前页左边的连续页码号中不包含第一页的页码,
# 所以需要显示第一页的页码号,通过 first 来指示
if left[0] > 1:
first = True
else:
# 用户请求的既不是最后一页,也不是第 1 页,则需要获取当前页左右两边的连续页码号,
# 这里只获取了当前页码前后连续两个页码,你可以更改这个数字以获取更多页码。
left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]
right = page_range[page_number:page_number + 2] # 是否需要显示最后一页和最后一页前的省略号
if right[-1] < total_pages - 1:
right_has_more = True
if right[-1] < total_pages:
last = True # 是否需要显示第 1 页和第 1 页后的省略号
if left[0] > 2:
left_has_more = True
if left[0] > 1:
first = True data = {
'left': left,
'right': right,
'left_has_more': left_has_more,
'right_has_more': right_has_more,
'first': first,
'last': last,
}
return data def index(request):
entries = models.Entry.objects.all()
page = request.GET.get('page', 1)
entry_list, paginator = make_paginator(entries, page)
page_data = pagination_data(paginator, page) return render(request, 'blog/index.html', locals())

(2)index.html

 <!--/.pagination-->
<div id="paginator" class="pull-right">
<ul class="pagination">
{% if entry_list.has_previous %}
<li><a href="?page={{ entry_list.previous_page_number }}"><i
class="glyphicon glyphicon-chevron-left"></i>前一页</a></li>
{% endif %} {% if first %}
<li><a href="?page=1">1</a></li>
{% endif %} {% if left %}
{% if left_has_more %}
<span>...</span>
{% endif %} {% for i in left %}
<li><a href="?page={{ i }}">{{ i }}</a></li>
{% endfor %}
{% endif %} <li class="active"><a href="?page={{ entry_list.number }}">{{ entry_list.number }}</a></li> {% if right %}
{% for i in right %}
<li><a href="?page={{ i }}">{{ i }}</a></li>
{% endfor %} {% if right_has_more %}
<span>...</span>
{% endif %}
{% endif %} {% if last %}
<li><a href="?page={{ entry_list.num_pages }}">{{ entry_list.num_pages }}</a></li>
{% endif %} {% if entry_list.has_next %}
<li><a href="?page={{ entry_list.next_page_number }}">下一页<i
class="glyphicon glyphicon-chevron-right"></i></a></li>
{% endif %}
</ul>
</div>
</div>

3.2.分类

(1)urls.py

 url(r'^category/(?P<category_id>[0-9]+)/$', views.catagory,name='blog_category'),

(2)views.py

def catagory(request,category_id):
c = models.Category.objects.get(id=category_id)
entries = models.Entry.objects.filter(category=c)
page = request.GET.get('page',1)
entry_list, paginator = make_paginator(entries, page)
page_data = pagination_data(paginator, page) return render(request, 'blog/index.html', locals())

(3)detail.html

&nbsp;&nbsp;&nbsp;&nbsp;分类:
{% for category in entry.category.all %}
&nbsp;&nbsp;<a href="{% url 'blog:blog_category' category.id %}">{{ category.name }}</a>
{% endfor %}

3.3.标签

(1)urls.py

url(r'^tag/(?P<tag_id>[0-9]+)/$', views.tag,name='blog_tag'),

(2)views.py

def tag(request,tag_id):
t = models.Tag.objects.get(id=tag_id)
if t.name == "全部":
entries = models.Entry.objects.all()
else:
entries = models.Entry.objects.filter(tags=t)
page = request.GET.get('page', 1)
entry_list, paginator = make_paginator(entries, page)
page_data = pagination_data(paginator, page)
return render(request, 'blog/index.html', locals())

(3)detail.html

 &nbsp;&nbsp;&nbsp;&nbsp;标签:
{% for tag in entry.tags.all %}
&nbsp;&nbsp;<a href="{% url 'blog:blog_tag' tag.id %}">{{ tag.name }}</a>
{% endfor %}

3.4.搜索功能

(1)urls.py

url(r'^search/$', views.search,name='blog_search'),

(2)views.py

def search(request):
keyword = request.GET.get('keyword',None)
if not keyword:
error_msg = "请输入关键字"
return render(request,'blog/index.html',locals())
entries = models.Entry.objects.filter(Q(title__icontains=keyword)
| Q(body__icontains=keyword)
| Q(abstract__icontains=keyword))
page = request.GET.get('page', 1)
entry_list, paginator = make_paginator(entries, page)
page_data = pagination_data(paginator, page)
return render(request, 'blog/index.html', locals())

(3)base.html

      <form class="navbar-form navbar-left" action="{% url 'blog:blog_search' %}">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search" name="keyword">
</div>
<button type="submit" class="btn btn-default">搜索</button>
</form>

3.5.博客侧边栏

(1)blog/templatetags/blog_tags.py

from django import template
from ..models import Entry,Category,Tag register = template.Library() @register.simple_tag
def get_recent_entries(num=5):
return Entry.objects.all().order_by('-created_time')[:num] @register.simple_tag
def get_popular_entries(num=5):
return Entry.objects.all().order_by('-visiting')[:num]

(2)blog/right_side_bar.html

{% load blog_tags %}

<div class="row">
<div class="widget">
<h3>最新博客</h3>
{% get_recent_entries as recent_entry_list %} {% for entry in recent_entry_list %}
<div>
<a href="{{ entry.get_absolute_url }}">{{ entry.title }}</a>
<div>{{ entry.author }} 发表于:{{ entry.created_time|date:"Y年m月d日" }}</div>
</div>
{% endfor %}
</div>
</div> <div class="row">
<div class="widget">
<h3>推荐博客</h3>
{% get_popular_entries as popular_entry_list %} {% for entry in popular_entry_list %}
<div>
<a href="{{ entry.get_absolute_url }}">{{ entry.title }}</a>
<span class="badge" style="color: white;background-color: darkgreen">{{ entry.visiting }}</span>
</div>
{% endfor %}
</div>
</div>

(3)index.html

添加进去

 <div class="col-md-3">
{% include 'blog/right_site_bar.html' %}
</div>

(4)detail.html一样添加

Django+Bootstrap+Mysql 搭建个人博客(三)的更多相关文章

  1. Django+Bootstrap+Mysql 搭建个人博客(一)

    1.1.环境搭建 (1)虚拟环境 mkvirtualenv website pip install django==1.11.7 (2)创建项目和app:website和blog (3)设置中文set ...

  2. Django+Bootstrap+Mysql 搭建个人博客(五)

    5.1.自定义403,404和500页面 (1)website/urls.py from blog import views as blog_views handler403 = blog_views ...

  3. Django+Bootstrap+Mysql 搭建个人博客(四)

    4.1.博客分类 (1)blog_tags.py @register.simple_tag def get_categories(): return Category.objects.all() @r ...

  4. Django+Bootstrap+Mysql 搭建个人博客(二)

    2.1.博客首页设计 (1)settings.py MEDIA_ROOT = os.path.join(BASE_DIR,'media').replace("//","/ ...

  5. Django+Bootstrap+Mysql 搭建个人博客(六)

    6.1.comments插件 (1)安装 pip install django-contrib-comments (02)settings INSTALLED_APPS = [ 'django.con ...

  6. Django+Bootstrap+Mysql 搭建个人博客 (六)

    6.1.comments插件 (1)安装 pip install django-contrib-comments (02)settings INSTALLED_APPS = [ 'django.con ...

  7. Python Web开发:Django+BootStrap实现简单的博客项目

    创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...

  8. django入门--django-blog-zinnia搭建个人博客

    1.安装python 选择合适python2.7及以上版本安装https://www.python.org/downloads/ 2.建立虚拟环境 这不是必须的,但是建议使用,为每个项目单独引入依赖, ...

  9. Django两天搭建个人博客

    传送门:https://github.com/1417766861/django-blog(可直接运行,上面有步骤) 效果: 首页: 侧栏: 详情页面: 修改头像,资料,文章发布: 支持添加标签拖拽 ...

随机推荐

  1. Docker 学习2 Docker基础用法

    一.docker架构 1.client端 2.server端,docker daemo守护进程,监听在套接字之上.docker支持三种类型套接字. a.ip vs套接字:即IP + 端口套接字 b.i ...

  2. Excel—图表函数

    OFFSET(引用函数)它可以找一个区域,把一个区域的值都拿回来 函数语法:OFFSET(从哪个单元格开始,这个单元格下移多少行开始,然后现在的位置再往右多少列开始,要取的值是现在的位置开始下移多少行 ...

  3. ubuntu频繁出现 安装包依赖关系

    折腾了一下午,还差点重装一次,最后记下解决办法,引以为戒! 第一步,备份官方的默认源 避免自己手贱操作失误,重装系统太费时间 cp /etc/apt/sources.list /etc/apt/sou ...

  4. BZOJ2143: 飞飞侠

    2143: 飞飞侠 题意: 给出两个 n ∗ m 的矩阵 A,B,以及 3 个人的坐标 在 (i, j) 支付 Ai,j 的费用可以弹射到曼哈顿距离不超过 Bi,j 的位置 问三个人汇合所需要的最小总 ...

  5. go语言数据库操作,xorm框架

    待续............................................... 连接数据库 db, err := xorm.NewEngine("mysql", ...

  6. Go语言基础(二)

    Go语言基础(二) 跟着上篇,继续看Go基础 一.变量作用域 与C类似,有全局变量.局部变量.形参之分 package main import "fmt" // 全局变量 var ...

  7. myeclipse中配置自己安装的Tomcat

    myeclipse中配置自己安装的Tomcat 在myeclipse中配置好jdk,Tomcat之后,如果是web项目需要部署运行,但在部署时发现配置好的Tomcat没有显示,只显示了myeclips ...

  8. The SQL Server instance returned an invalid or unsupported protocol version during login negotiatio

    在使用.net core 连接sqlserver的时候遇到了这个问题 从字面意思理解大致是个什么版本不支持, 谷歌一下吧,ok,看到这个2000我就知道什么问题了 我的数据库还是2000的,总算把20 ...

  9. 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...

  10. 马昕璐 201771010118《面向对象程序设计(java)》第十八周学习总结

    实验十八  总复习 实验时间 2018-12-30 1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设 ...