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. [转]7行Python代码的人脸识别

    https://blog.csdn.net/wireless_com/article/details/64120516 随着去年alphago 的震撼表现,AI 再次成为科技公司的宠儿.AI涉及的领域 ...

  2. Java - 数组详解(图解数组的基本操作)

    目录 什么是数组 数组的定义和内存分配 数组的赋值和访问 数组的注意事项 数组的内存图解 数组的插入 数组的删除 数组的扩容 数组的反转 首先 什么是数组 数组是一组地址连续.长度固定的具有相同类型的 ...

  3. JSP(一):JSP概要

    问题: 在学习了 Servlet 之后,使用 Servlet 进行页面的展现,代码书写过于麻烦.极大的影响了开发的效率,那么有没有一种方式可以让我们像以前写网页一样来进行网页的编程工作呢? 解决: 使 ...

  4. leetcode刷题六<z字形变换>

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐 ...

  5. FW/IDS/IPS/WAF等安全设备部署方式及优缺点

    现在市场上的主流网络安全产品可以分为以下几个大类:1.基础防火墙FW/NGFW类 主要是可实现基本包过滤策略的防火墙,这类是有硬件处理.软件处理等,其主要功能实现是限制对IP:port的访问.基本上的 ...

  6. Android SDK提供的常用控件Widget “常用控件”“Android原生”

    Android提供一个标准的视图工具箱来帮助创建简单的UI界面.通过使用这些控件(必要时,可以对这些控件进行修改). 创建一个简单的.xml文件,从预览窗口可以看到Android SDK提供的原生控件 ...

  7. BZOJ 4665

    orz gery 一发rk1真有趣(其实我没想着常数优化 inline int sqr(int x){return 1ll*x*x%mo;} const int N=2011; int n,a[N], ...

  8. 常用的Tensor操作

    常用的Tensor操作 1.通过tensor.view方法可以调整tensor的形状,但必须保证调整去前后元素总数一致.view不会修改自身的数据,返回新的tensor与原tensor共享内存,即更改 ...

  9. 使用mongo获取文章

    先在命令行中输入mongo,进入mongo,然后 show dbs # 从结果中发现有cmb_demo_23_hacker use cmb_demo_23_hacker db.all_in_one.f ...

  10. mysql8.0.13修改密码

    在安装完数据库后,由于自己不小心直接关闭了安装窗口,或者长时间没有使用root用户登录系统,导致忘记了root密码,这时就需要重置MySQL的root密码.当然,最简单方式自然是删除数据库的data目 ...