Django之自定义标签,过滤器,以及inclusion_tag

目录

  • Django之自定义标签,过滤器,以及inclusion_tag

    • 自定义过滤器
    • 自定义标签
    • inclusion_tag
    • inclusion_tag() 项目实例:
      • inclusion_tag()
      • 案例(博客左侧标签栏)

Django之自定义标签,过滤器,以及inclusion_tag

自定义过滤器

1,确定app是否在setting中注册

2 在app下创建一个templatetags的文件夹(模块)(名字不能变***)

3 在模块下创建一个py文件,名字随意:mytag.py

4 第一步(在templatetags文件夹中),导入template

? from django.template import Library

? 第二步,定义一个叫register的变量=template.Library()

? register = Library()

5 写一个函数(在templatetags文件夹中),用@register.filter(name=‘yyy‘)装饰一下(可以指定别名)

? def str_add(str1, str2): #一定要有返回值

? # 业务逻辑很复杂

? return str1 + str2

6 在模板里:(新定定义的标签,过滤器,都要重启程序)

? -{% load mytag %}

? -{{‘lqz‘|str_add:‘nb‘}}

自定义标签

1,确定app是否在setting中注册

2 在app下创建一个templatetags的文件夹(模块)(名字不能变)

3 在模块下创建一个py文件,名字随意:mytag.py

4 第一步(在templatetags文件夹中),导入template

? from django.template import Library

? 第二步,定义一个叫register的变量=template.Library()

? register = Library()

5 只是装饰器不一样,(在templatetags文件夹中)

? @register.simple_tag()

? def add_nb(value):

? return value+‘nb‘

6 在模板里:(多个参数,以空格区分)

? -{% load mytag %}

? -{% add_nb ‘lqz‘%}

inclusion_tag

1 inclusion_tag

为了生成html的片段(动态,传参数,传数据)

2,步骤:
-app下新建一个模块,templatetags

? -创建一个py文件(mytag.py)

? -from django.template import Library

? -register=Library() -----register名字一定不能变

? -写装饰器(inclusion_tag)

? [email protected]_tag(‘模板路径‘,name=‘重命名‘)

? -def my_in(): (不写可以,写多个也可以,在使用的时候用空格来传参)

? - 一堆逻辑处理,查数据库

? - ret=Book.object.all()

? return {‘books‘:ret}

? -在模板中:

? 可以用books这个变量(在模板中引用的是books这个变量代表的是返回的这个列表),

渲染页面

? -应用:

? -在另一个模板中:

? -{%load mytag.py%}

? -{% my_in %}

inclusion_tag() 项目实例:

inclusion_tag()

原型: django.template.Library.inclusion_tag()

主要作用:通过渲染一个模板来显示一些数据。

例如,Django的Admin界面使用自定义模板标签显示"添加/更改"表单页面底部的按钮。这些按钮看起来总是相同,但链接的目标却是根据正在编辑的对象而变化的。

这种类型的标签被称为"Inclusion 标签",属于自定义标签的一种。

案例(博客左侧标签栏)

一个博客的主页面的左侧栏和查看博客某篇文章的页面的左栅栏的一样的。为了不用重复写同样的代码。且提高页面的扩展性。我的bbs的左侧栏就用了inclusion_tag来实现。

1.目录结构

在项目blog这个app下面创建一个 templatetags 文夹。这个文件夹的名字必须是 templatetags 来命名的。然后在此文件夹下自定义一个 mytag.py 文件。

2. mytag.py:

这一个就是来处理不同数据的函数,返回的结果一致。

from django import template
from django.db.models import Count
from blog import models

register = template.Library()

@register.inclusion_tag('classfication.html')
def get_calssfication_style(username):
    user = models.UserInfo.objects.filter(username=username).first()
    print(user.username)
    blog=user.blog
    nblog_id = user.blog_id
    print(nblog_id)

    cate_list = models.Category.objects.filter(blog_id=nblog_id).values("pk").annotate(c=Count("article__title")).values_list(
        "title", "c")
    print(cate_list)

    tag_list = models.Tag.objects.filter(blog_id=nblog_id).values("pk").annotate(c=Count("article")).values_list("title", "c")

    date_list = models.Article.objects.filter(user=user).extra(
        select={"y_m_date": "date_format(create_time,'%%Y/%%m')"}).values("y_m_date").annotate(
        c=Count("nid")).values_list("y_m_date", "c")

    return {"blog": blog, "cate_list": cate_list, "date_list": date_list, "tag_list": tag_list,"username":username}

3.classfication.html

用来渲染mytag.py所返回的数据

 <div>
    <div class="panel panel-warning">
                <div class="panel-heading">我的标签</div>
                <div class="panel-body">

                    {% for tag in tag_list %}
                         {% if username %}
{#                        <p><a href= "{{ username }}/tag/{{ tag.0 }}">{{ tag.0 }}({{ tag.1 }})</a></p>#}
                        <p><a href= "{% url 'blog_info' username=username condition='tag' param=tag.0 %}">{{ tag.0 }}({{ tag.1 }})</a></p>
                        {% endif %}
                    {% endfor %}

                </div>
            </div>

    <div class="panel panel-danger">
        <div class="panel-heading">随笔分类</div>
        <div class="panel-body">
            {% for cate in cate_list %}
                <p><a href="/{{ username }}/category/{{ cate.0 }}">{{ cate.0 }}({{ cate.1 }})</a></p>
            {% endfor %}
        </div>
    </div>

    <div class="panel panel-success">
        <div class="panel-heading">随笔归档</div>
        <div class="panel-body">
            {% for date in date_list %}
                <p><a href="/{{ username }}/archive/{{ date.0 }}">{{ date.0 }}({{ date.1 }})</a></p>
            {% endfor %}
        </div>
    </div>
 </div>

4. base.html:

这里我需要在 base.html 中引用上面的 classfication.html ,只需要在合适的地方加入以下两行代码:

 {% load mytag %}
 {% left_panel username %}

上面的代码中 username 是一个参数。

原文地址:https://www.cnblogs.com/TMesh/p/11832782.html

时间: 2024-08-29 15:24:07

Django之自定义标签,过滤器,以及inclusion_tag的相关文章

django中自定义标签和过滤器

想要实现自定义标签和过滤器需要进行准备工作: 准备(必需)工作: 1  在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为polls的app下创建了一个templatetags的包,并在该包下创建了一个名为mytags的文件.那么目录结构看起来应该就像这样: polls/ __init__.py models.py templatetags/ __init__.py mytags.py views.py 2  settings文件中的INSTALLD_A

Django框架自定义标签和过滤器

自定义过滤器 '''定义一个无参数过滤器''' 1:#:在当前的应用中创建一个templatetags的文件夹(必须叫这个名字),然后在文件夹中创建一个python文件,名字随便 2:#在新建的python中引入django模块的template类,然后实例化一个register对象,对象的名字必须是register from django import template register = template.Library()#register对象名字不可更改 3:#在新建的python中定

django 组件 自定义标签 静态文件配置

组件 将一些功能标签写在一个html文件里,这个文件作为一个组件,如果那个文件需要就直接拿过来使用即可: 这是title.html文件,写了一个导航栏,作为一个公用的组件 <div style="background-color: cyan;width: 100%;height: 40px;"> <span style="font-size: 20px;">首页</span> <span style="font-s

自定义标签过滤器

1 2 模版之过滤器 2 -语法:{{第一个参数|过滤器名字:第二个参数}} 3 -常用过滤器:(详细用法见源码) 4 -length 5 -default 6 -slice 7 -date 8 -filesizeformat 9 -truncatechars 10 -truncatewords 11 -safe 12 -add 13 3 模版之标签 14 -{% 标签 %} 15 -for:forloop:对象(里面有好多东西:parentloop,last,first,counter....

Django的自定义标签

Django提供了自定义标签功能,可以方便常用方法的重复使用. 标签的本质就是函数,标签名就是函数名. 注意点: 1.需要到django.template对象. 2.register = template.Library(),@register.simple_tag作为装饰器. 3.在html中使用标签时,要先{% load blog_tags %},之后才能使用blog_tags.py中的自定义标签. 4.blog_tags.py的项目位置,位于应用目录下的templatetags目录下,te

Django下自定义标签和过滤器

---恢复内容开始--- 第一步:确保setting中的INSTALL_APPS配置当前的app,要不然Django无法找到自定义的simple_tag. 第二步:在app中创建templatetags模块(模块名只能是templatetags) 第三步:创建任意的.py文件  比如:my_tags.py from django import template from django.utils.safestring import mark_safe register = template.Li

DJANGO之自定义模板过滤器

我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.iteye.com/blog/1884630 http://www.xxx.com/html/2013/pythonweb_1017/588.html templatetags目录下的deploy_filter.py文件如下: #!/usr/bin/env python # coding:utf-8 f

Django(七)—— 模板层:变量、过滤器、标签、自定义标签和过滤器

模板层:变量.过滤器.标签.自定义标签和过滤器 将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式 # django模板修改的视图函数 def current_time(req): from django.template import Template,Context now=datetime.datetime.now() t=Template('<html><body>现在时刻

django 自定义标签和过滤器

django 自定义标签和过滤器 Django支持自定义标签和过滤器.起初还不太重视它这项功能,但最近试了试自定义标签.发现django这个功能实在是太爽了. 首先在你项目的一个app中建立一个python源文件夹,(即文件夹里面要包含一个__init__.py.)文件夹名为templatetags.  此文件夹便是存放自定义标签和过滤器的源码的地方了. 再如果是在templatetags文件夹中定义了标签,如 test_tags.py,要如何使用我们自定义的test_tags.py呢.很简单,