首页 > 其他 > 详细

Django 上下文管理器的应用

时间:2019-12-09 12:06:27      阅读:54      评论:0      收藏:0      [点我收藏+]

使用场景:模板继承可以减少页面内容的重复定义,实现页面内容的重用。个人博客右侧的导航栏都是继承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=2)
    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>

 

 

Django 上下文管理器的应用

原文:https://www.cnblogs.com/hooo-1102/p/12009782.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!