zoukankan      html  css  js  c++  java
  • Django 上下文管理器的应用

    使用场景:模板继承可以减少页面内容的重复定义,实现页面内容的重用。个人博客右侧的导航栏都是继承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>
  • 相关阅读:
    Java IO流
    博客园禁止pc端以及手机端选中复制粘贴
    eclipse debug模式出现 source not found
    Winform之跨线程访问控件(在进度条上显示字体)
    WPF中DataGrid的ComboBox的简单绑定方式(绝对简单)
    WPF制作QQ列表(仿qq列表特效)
    WPF柱状图(支持数据库动态更新)之组件的数据动态化
    WPF柱状图(支持数据库动态更新)
    WPF仿微软事件和属性窗体,效果更炫!
    DataGrid缓冲加载数据
  • 原文地址:https://www.cnblogs.com/hooo-1102/p/12009782.html
Copyright © 2011-2022 走看看