使用场景:模板继承可以减少页面内容的重复定义,实现页面内容的重用。个人博客右侧的导航栏都是继承base页面从而让代码得到最大程度的复用。但是当父模板中有动态数据的话,这些动态数据在子模版中是不会显示的。我们可以通过自定义上下文处理器来解决。

结构:上下文管理器文件名一般为context_processors.py,def  xx(request) 为一个自定义函数,必要参数request,将里面的内容以字典的形式返回给所有模板,模板通过 {{ key }}取值。

配置:它需要被配置在 settings里

提示:在django的上下管理器中,尽量不要写太重量级的代码,因为上下文渲染器的中代码,每一次请求都会执行一次,如果这个渲染器过重,会非常影响性能

setting.py:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],#设置网站模板根目录
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
#上下文管理器定义
'MyBlog.context_processor.site_info',
],
},
},
]

context_processors.py:

#coding=utf-8
from random import shuffle
import datetime from django.conf import settings as original_settings from blog.models import UserProfile, Siteinfo, Category, Article #导入站长及站长资料model def site_info(request):
'''站长资料、网站资料,所有分类上下文'''
userinfo = UserProfile.objects.get(pk=1)#站长资料
siteinfo = Siteinfo.objects.get(pk=1)#获取站点信息
categorys = Category.objects.all().order_by('category_sort_id')#获取所有分类 hot_articles = Article.objects.all().order_by('-article_click')[:10]#获取热门文章
ac_count = Article.objects.count()#获得文章数量
d1 = datetime.datetime.now()
d2 = datetime.datetime(2020, 1, 1)
killpy2 = (d2 - d1).days#python2停止维护时间
acs= Article.objects.all()
ac_click = 0 #总点击数
for ac in acs:
ac_click += int(ac.article_click) # datetimes() 方法返回一个 python 的 datetimes 对象列表
# 对应着每篇文章的发表时间
# month 表示精确到月份,DESC 表示降序排列
dates = Article.objects.datetimes('article_create_time', 'month', order='DESC') # 获取文章标签
l = Article.objects.values("article_tag").distinct().filter(article_type='')
tags = []
for tag in l:
T = tag['article_tag']
tags.append(T)
shuffle(tags) tagcss =['am-radius','am-badge-primary','am-badge-secondary','am-badge-success','am-badge-warning','am-badge-danger']
# return {'userinfo':userinfo, 'siteinfo':siteinfo, 'categorys':categorys,
# 'dates':dates, 'tags':tags, 'tagcss':tagcss,
# 'hot_articles':hot_articles,'ac_count':ac_count,'killpy2':killpy2,'ac_click':ac_click,}
return locals()

base.html(举部分栗子,使用上下文管理器中的tags):

  <!-- 标签云 -->
<section class="am-panel am-panel-default">
<div class="am-panel-hd">标签云</div>
<div class="am-panel-bd">
{% for tag in tags %}
<a href="{% url '' %}?t={{ tag }}" class="am-badge {{ tagcss | random }}">{{ tag }}</a>
{% endfor %}
</div>
</section>

最新文章

  1. Mac制作U盘系统(OS X El Capitan)教程
  2. java 十六进制颜色对照表
  3. Ecshop(二次开发) - 后台添加左侧菜单导航
  4. 2天驾驭DIV+CSS (基础篇)(转)
  5. 使用Devexpress中的CharControl控件,需要控制AxisY轴的显示范围,需要使用该控件的BoundDataChanged事件
  6. POJ 1742 Coins ( 单调队列解法 )
  7. Struts2+Hibernate框架探险
  8. .22-浅析webpack源码之事件流compilation总览
  9. Kafka相关内容总结(存储和性能)
  10. CORS在Spring中的实现
  11. Java 之 JQuery
  12. 20. Spring Boot 默认、自定义数据源 、配置多个数据源 jdbcTemplate操作DB
  13. Linux Bash on Win10 (WSL)在cmder下使用vim时方向键失灵问题解决
  14. ThreadPoolExecutor简单学习
  15. Yum 安装并设置 MySQL
  16. 7款Flash和Javascript网页视频播放器
  17. Halcon标定
  18. P3648 [APIO2014]序列分割
  19. Problem K: 数字菱形
  20. linux 远程装机

热门文章

  1. eclipse安装weblogic Server服务器
  2. 如何为nginx配置https(免费证书)
  3. 二、SQL Server 分页
  4. windows linux子系统(Windows Subsystem for Linux)的存放目录
  5. 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)
  6. 微信小程序学习二 微信小程序的项目结构
  7. 前端每日实战:63# 视频演示如何用纯 CSS 创作一台烤面包机
  8. windows2008R2-Exchange管理笔记
  9. 0-2马尔可夫过程Markov Processes
  10. C++ 分治思想 真假银币