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. 解决用SHA256算法做私钥签名时,遇到“指定的算法无效”的问题

    在上一篇随笔“记一次三方接口开发的数据加密方案”中,使用SHA256对数据进行签名时,我提到了一个异常,System.Security.Cryptography.CryptographicExcept ...

  2. notes for lxf(三)

    纯函数式编程是没有变量的,只要输入确定输出就确定 指高度抽象的编程范式 特点 函数本身可以作为参数传入 或者允许返回一个函数 Higher-order function 一个函数可以接收另一个函数作为 ...

  3. 启动两个tomcat服务,以及使用nginx代理实现访问

    1.shoudowm.bat\startup.bat\catalina.bat, 将CATALINA_HOME修改为CATALINA_HOME_2 2.server.xml <Server po ...

  4. 支付宝红包口令自动复制到剪贴板脚本js,安卓,IOS通用版

    有客户找到涛舅舅,要求开发一个可以自动支付宝红包口令的js脚本,经过大量探索和优化,目前此脚本功能已经测试成功! 预期效果: 只要来访用户在当前网页的任意位置点击一下,支付宝红包口令即可复制到用户手机 ...

  5. JS精度问题(0.1+0.2 = 0.3吗?)

    一.引出问题 0.1+0.2 = 0.3吗?在JS中是这样的吗?我们写个测试代码不就知道了吗? 结果出人意料,并不像我们所想象的那样.那么这到底是为什么呢? 二.原因分析 JS浮点数存储机制: 三.解 ...

  6. 2018-2019-2 网络对抗技术 20162329 Exp6 信息搜集与漏洞扫描

    目录 Exp6 信息搜集与漏洞扫描 一.实践原理 1. 间接收集 2. 直接收集 3. 社会工程学 二.间接收集 1. Zoomeye 2. FOFA 3. GHDB 4. whois 5. dig ...

  7. iOS 获取app进程被杀死事件

    程序被用户双击上滑杀死后,就对app做一些特殊的处理 下面的方法可以获取到用户双击上滑杀死的事件 - (void)applicationDidEnterBackground:(UIApplicatio ...

  8. MyBatis返回map数据

    (1)接口中编写方法 //单行 public Map<String, Object> getEmpReturnMap(Integer id); //多行 @MapKey("id& ...

  9. 机器学习--------SVM

    #SVM的使用 (结合具体代码说明,代码参考邹博老师的代码) 1.使用numpy中的loadtxt读入数据文件 data:鸢尾花数据 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3 ...

  10. mac搭建简单的hls推流服务器遇到的问题(待更新)

    实际操作步骤: 输入brew install nginx-full --with-rtmp-module命令出现以下报错: 需要先安装nginx服务器,运行命令brew tap homebrew/ng ...