浅谈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:自定义完标签后,在模板中怎么使用呢?

浅谈Django自定义模板标签template_tags的用处

我的自定义过的标签放在templatetags/paginate_tags.py中

浅谈Django自定义模板标签template_tags的用处

处理函数


{% 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

标签:django,templatetags
0
投稿

猜你喜欢

  • Python爬虫:通过关键字爬取百度图片

    2022-06-16 11:32:47
  • Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环

    2024-01-26 18:49:00
  • python数据结构之二叉树的统计与转换实例

    2023-08-11 07:35:48
  • 基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)

    2022-09-21 05:14:57
  • JSP实现登录功能之添加验证码

    2023-07-16 12:18:09
  • python分析apache访问日志脚本分享

    2021-08-12 04:20:09
  • 使用 Python 破解压缩文件的密码的思路详解

    2021-09-29 22:36:48
  • 七个生态系统核心库[python自学收藏]

    2021-09-17 03:51:12
  • flask框架jinja2模板与模板继承实例分析

    2023-08-26 22:21:34
  • python中__call__方法示例分析

    2023-01-16 04:31:31
  • python arcpy练习之面要素重叠拓扑检查

    2021-12-24 12:41:42
  • PyQt5实现暗黑风格的计时器

    2023-07-07 02:49:30
  • python批量修改文件后缀示例代码分享

    2021-11-19 13:45:09
  • MySql 5.7.21免安装版本win10下的配置方法

    2024-01-23 00:45:35
  • Python数据结构与算法的双端队列详解

    2021-10-08 13:24:27
  • Python高级特性切片(Slice)操作详解

    2022-04-07 20:28:02
  • 详解python的集合set的函数

    2023-02-06 04:16:42
  • Jupyter notebook运行后打不开网页的问题解决

    2021-07-10 01:35:30
  • Pytorch中的Broadcasting问题

    2022-10-03 06:26:58
  • 详解在spring中使用JdbcTemplate操作数据库的几种方式

    2024-01-29 09:29:50
  • asp之家 网络编程 m.aspxhome.com