Django之自定义标签,过滤器,以及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)
-@inclusion_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 是一个参数。
Django之自定义标签,过滤器,以及inclusion_tag的更多相关文章
- day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁
一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...
- day058 聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁
1.聚合(aggregate) 聚合的主要语法: from django.db.models import Avg , Max , Min , Count models.类名 .objects.all ...
- django模板-自定义标签、过滤器
自定义标签或者过滤器的步骤 ①将要创建自定义标签或过滤器的app加入settings文件的installed_apps中 ②在app中创建templatetags目录,类型为包即packages ③在 ...
- django中自定义标签和过滤器
想要实现自定义标签和过滤器需要进行准备工作: 准备(必需)工作: 1 在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为polls的app下创建了一个tem ...
- Django模板自定义标签和过滤器,模板继承(extend),Django的模型层
上回精彩回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...
- Django的自定义标签
Django提供了自定义标签功能,可以方便常用方法的重复使用. 标签的本质就是函数,标签名就是函数名. 注意点: 1.需要到django.template对象. 2.register = templa ...
- Django 六——自定义标签、图片验证码、发送邮件、评论树、组合搜索
1.自定义标签 2.图片验证码 3.生成邮箱验证码.发送邮件 4.评论树实现 5.组合搜索(Q) 1.自定义标签 配置: a.在app中新建文件夹 templatetags,里面新建 xx.py文 ...
- Django下自定义标签和过滤器
---恢复内容开始--- 第一步:确保setting中的INSTALL_APPS配置当前的app,要不然Django无法找到自定义的simple_tag. 第二步:在app中创建templatetag ...
- DJANGO之自定义模板过滤器
我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.it ...
随机推荐
- vue 打包部署到服务器上 配置nginx访问
坑一 css,js资源引入不正确 webpack配置文件config/index.js 需要更改: 方法一 当部署到带有文件夹的项目中,这种绝对路径就会出现问题,因为把配置的static文件夹当成了根 ...
- 20165213 Exp9 Web安全基础
Exp9 Web安全基础 一.基础性问答 (1)SQL注入攻击原理,如何防御 原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾 ...
- Solr 5.2.1 部署并索引Mysql数据库
1.Solr简介 Solr是一个高性能,采用Java5开发,SolrSolr基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查 ...
- Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference
指针基础知识package main import "fmt" func main() { var p *int p = new(int) *p = 1 fmt.Println(p ...
- python--nolocal
Compare this, without using nonlocal: x = 0def outer(): x = 1 def inner(): x = 2 print("inner:& ...
- OGG-00446 分析与解决
OGG-00446 分析与解决 Table of Contents 1. 00446 1.1. Missing filename opening checkpoint file 1.1.1. 错误信息 ...
- Win10资源管理器始终使用详细视图模式
Win10系统中使用资源管理器时,如果文件夹里有音乐文件就自动切换视图模式为音乐模式,这样有时确实很头疼,看不到文件的大小等信息. 解决的办法如下: 新创建FolderType = NotSpecif ...
- 利用SQL语句查找某数据库中所有存储过程包含的内容(转)
Use 数据库DECLARE @ProcName varchar(50)Create Table #tmpName(Content varchar(2000))Create Table #tmp(P ...
- appium+python等待方式使用
背景: 首先,由于一个网速和手机性能以及服务器反应时间等等的原因,不可能导致我们点击了某一个元素之后,它所要链接的页面马上弹出来可以进行下一步操作.所以我们需要一种等待方式,直至链接的页面跳出来之后再 ...
- windows下sqlplus怎么连接远程oracle
语法:sqlplus usr/pwd@//host:port/sid [oracle@mzl ~]$ sqlplus system/51411482@//192.168.21.11:1521/orcl ...