浅谈Django自定义模板标签template_tags的用处
作者:欧吃伞 发布时间:2023-03-13 11:21:08
自定义模板标签,过滤器。英文翻译是Customtemplatetagsandfilters。customfilter自定义过滤器今天不在我的记录范围之内,以后用到再看官方文档也不迟。
**问题1:**customtemplatetags到底长啥样?
customtemplatetags—github
Manytemplatetagstakeanumberofarguments–stringsortemplatevariables–andreturnaresultafterdoingsomeprocessingbasedsolelyontheinputargumentsandsomeexternalinformation.Forexample,acurrent_timetagmightacceptaformatstringandreturnthetimeasastringformattedaccordingly.
Toeasethecreationofthesetypesoftags,Djangoprovidesahelperfunction,simple_tag.Thisfunction,whichisamethodofdjango.template.Library,takesafunctionthatacceptsanynumberofarguments,wrapsitinarenderfunctionandtheothernecessarybitsmentionedaboveandregistersitwiththetemplatesystem.
(为了降低customtags的难度,你可以使用Django提供的快捷函数simple_tag)
Ourcurrent_timefunctioncouldthusbewrittenlikethis:
import datetime
from django import template
register = template.Library()# 只有向系统注册过的tags,系统才认得你。
@register.simple_tag(takes_context=True)#加上这句后我就是一名合格的template tags
def current_time(context, format_string):
timezone = context['timezone']
return your_get_current_time_method(timezone, format_string)
Note that the first argument must be called context.
Note that the first argument must be called context.
Note that the first argument must be called context.
@register.simple_tag(takes_context=True)
# 这个装饰器表明这个函数是一个模板标签,takes_context = True 表示接收上下文对象,就是前面所说的封装了各种变量的 Context 对象。
def paginate(context, object_list ,page_count):
# context是Context 对象,object_list是你要分页的对象,page_count表示每页的数量 , page_count
left = 3 # 当前页码左边显示几个页码号 -1,比如3就显示2个
right = 3 # 当前页码右边显示几个页码号 -1
paginator = Paginator(object_list, page_count) # 通过object_list分页对象
page = context['request'].GET.get('page') # 从 Http 请求中获取用户请求的页码号
try:
object_list = paginator.page(page) # 根据页码号获取第几页的数据
context['current_page'] = int(page) # 把当前页封装进context(上下文)中
pages = get_left(context['current_page'], left, paginator.num_pages) + get_right(context['current_page'], right,
paginator.num_pages)
# 调用了两个辅助函数,根据当前页得到了左右的页码号,比如设置成获取左右两边2个页码号,那么假如当前页是5,则 pages = [3,4,5,6,7],当然一些细节需要处理,比如如果当前页是2,那么获取的是pages = [1,2,3,4]
except PageNotAnInteger:
# 异常处理,如果用户传递的page值不是整数,则把第一页的值返回给他
object_list = paginator.page(1)
context['current_page'] = 1 # 当前页是1
pages = get_right(context['current_page'], right, paginator.num_pages)
except EmptyPage:
# 如果用户传递的 page 值是一个空值,那么把最后一页的值返回给他
object_list = paginator.page(paginator.num_pages)
context['current_page'] = paginator.num_pages # 当前页是最后一页,num_pages的值是总分页数
pages = get_left(context['current_page'], left, paginator.num_pages)
context['article_list'] = object_list # 把获取到的分页的数据封装到上下文中
context['pages'] = pages # 把页码号列表封装进去
context['last_page'] = paginator.num_pages # 最后一页的页码号
context['first_page'] = 1 # 第一页的页码号为1
try:
# 获取 pages 列表第一个值和最后一个值,主要用于在是否该插入省略号的判断,在模板文件中将会体会到它的用处。注意这里可能产生异常,因为pages可能是一个空列表,比如本身只有一个分页,那么pages就为空,因为我们永远不会获取页码为1的页码号(至少有1页,1的页码号已经固定写在模板文件中)
context['pages_first'] = pages[0]
context['pages_last'] = pages[-1] + 1
# +1的原因是为了方便判断,在模板文件中将会体会到其作用。
except IndexError:
context['pages_first'] = 1 # 发生异常说明只有1页
context['pages_last'] = 2 # 1 + 1 后的值
return '' # 必须加这个,否则首页会显示个None
问题2:自定义完标签后,在模板中怎么使用呢?
我的自定义过的标签放在templatetags/paginate_tags.py中
处理函数
{% load paginate_tags %}#第一步:把文件名包含进来
{% paginate blogposts 2 %} #第二步:调用函数 添加参数。注意context参数不用你传。
注意:
经由defpaginate(context,object_list,page_count):函数处理过的数据,在模板中如何使用???
context['article_list'] = object_list # 把获取到的分页的数据封装到上下文中
context['pages'] = pages # 把页码号列表封装进去
context['last_page'] = paginator.num_pages # 最后一页的页码号
context['first_page'] = 1 # 第一页的页码号为1
数据输送到函数中,进行处理,然后将数据封装到之前的context上下文变量中,供template使用,使用方式和使用字典一样。
总结
简单了解Django模板的使用
获取Django项目的全部url方法详解
django实现用户登陆功能详解
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
来源:http://blog.csdn.net/weixin_36571185/article/details/74188230
猜你喜欢
- Google Talk是一个功能很简洁的即时通讯工具,尤其是它的文字输入区域,不同于其他IM,除了一个文字输入区域外没有任何其他操作。但是用
- 首先为大家分享python实现发送手机短信验证码后台方法,供大家参考,具体内容如下1、生成4位数字验证码def createPhoneCod
- 前言我们将利用 Beautiful Soup 模块的搜索功能,根据标签名称、标签属性、文档文本和正则表达式来搜索。搜索方法Beautiful
- 设置部分:首先网页登录QQ邮箱设置一些待会儿会用到的参数:首先开启POP3/SMTP和IMAP/SMTP服务,然后生成授权码,然后复制到代码
- PHP PDO连接连接是通过创建 PDO 基类的实例而建立的。不管使用哪种驱动程序,都是用 PDO 类名。连接到 MySQL<?php
- iframe的背景颜色在IE下为window的当前窗口颜色(默认白色,可以在显示外观处对其进行设置),这导致在大幅背景上插入iframe时,
- 首先介绍下简朝阳.现就职于阿里巴巴(中国)网络技术有限公司DBA Team运维部, 简朝阳是本次MYSQL技术征文大赛第三名得主(获奖文章:
- 背景写代码的时候,你会发现你的代码越写越多。然而,功能需要也越来越多,然后你的冗余代码就多得不能再多了~~~怎么办,我太难了。那就寻求一些高
- 注:此处“重复”非完全重复,意为某字段数据重复HZT表结构IDintTitlenvarchar(50)AddDatedatetime数据一.
- CSS是众所周知且应用广泛的网站样式语言,在它的版本三(CSS3)计划中,新增了一些能够节省时间的特性。尽管只有当前最新了浏览器
- 一、去除空格strip()" xyz ".strip() &n
- Tensorboard详解该类在存放在keras.callbacks模块中。拥有许多参数,主要的参数如下:1、log_dir: 用来保存Te
- phpMyAdmin错误 缺少 mysqli 扩展。请检查 PHP 配置 的解决方案phpMyAdmin 缺少 mysqli 扩展。请检查
- 本文研究的主要是Python生成器及其应用,具体如下。一、定义可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调
- return 语句用于退出函数,向调用方返回一个表达式。执行到 return 语句时,会退出函数,return 之后的语句不再执行。如:de
- 通过本文给大家介绍Python3控制路由器——使用requests重启极路由.py的相关知识,代码写了相应的注释,以后再写成可以方便调用的模
- 利用python+ffmpeg合并B站视频及格式转换 B站客户端下载的视频一般有两种格式:早期的多为blv格式(由flv格式转换而来,音视频
- 方法一 :这个是我在站长工具的查询页面使用的防止频繁查询,刷新页面的代码!下面函数的功能是3秒内查询页面即刷新了页面,超过2次就提示!sea
- 这篇文章主要介绍了如何使用Python多线程测试并发漏洞,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 初试牛刀假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程。那么本教程将花费十分钟的时间带你走入Python的大门。本