Django

  1. 自定义过滤器
  2. 自定义标签
    1. 简单标签
    2. 包含标签

自定义过滤器

自定义过滤器就是一个带有一个或两个参数的Python 函数:

  • - (输入的)变量的值 —— 不一定是字符串形式。
  • - 参数的值 —— 可以有一个初始值,或者完全不要这个参数。

注册自定义过滤器

  • django.template.Library.filter()
  • Library.filter()方法需要两个参数:
    • 过滤器的名称(一个字符串对象)
    • 编译的函数 – 一个Python函数(不要把函数名写成字符串)
  • 可以把register.filter()用作装饰器;
  • 没有声明 name 参数,Django将使用函数名作为过滤器的名字。

首先需要新建一个包,以APP的形势存在(加入到INSTALLED_APPS中),例如新建一个comment的包(就是一个comment的文件夹,里面包含一个init的py文件)

然后在里面新建一个包,固定名字为templatetags,在里面新建一个py文件(自定义)

在settings中添加

my_filter中:定义了一个replace得过滤器,还有一个title得过滤器

from django import template
register = template.Library() @register.filter()
def my_cut(value, arg):
return value.replace(arg, '') @register.filter # 这个括号可以不加,还可以在括号里面重命名方法名
def my_capfirst(value):
return value.title()

views中:

from django.shortcuts import render

def diy_filter(request):
return render(request, 'DIY/diy.html', context={
'string': 'hello django',
})

定义好url路径和视图,在html中:

{% load my_filter %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义内容</title>
<style>
</style>
</head>
<body>
<p>{{ string }}</p>
<p>django自带的首字母大写:{{ string|capfirst }}</p>
<p>自定义的首字母大写:{{ string|my_capfirst }}</p>
<p>django自带的cut:{{ string|cut:' ' }}</p>
<p>自定义的cut:{{ string|my_cut:' ' }}</p>
</body>
</html>


自定义标签

  • 简单标签    django.template.Library.simple_tag()
  • 包含标签    django.template.Library.inclusion_tag()

tag()方法有两个参数:

  • 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
  • 编译的函数 – 一个Python函数(不要把函数名写成字符串)与过滤器注册一样,也可以将其用作装饰器。

自定义简单标签

urls路径一样,视图添加一个时间格式

views:

from django.shortcuts import render

def diy_filter(request):
return render(request, 'DIY/diy.html', context={
'string': 'hello django',
'time_format': '%Y年%m月%d日 %H:%M:%S',
})

my_filter:

from django import template
from datetime import datetime
register = template.Library() # 自定义标签
# 简单标签
@register.simple_tag
def current_time():
time_format = '%Y年%m月%d日 %H:%M:%S'
return datetime.now().strftime(time_format) @register.simple_tag
def current_time1(time_format):
return datetime.now().strftime(time_format) # 简单标签+上下文
@register.simple_tag(takes_context=True)
def current_time2(context):
time_format = context.get('time_format')
return datetime.now().strftime(time_format)

html中:

{% load my_filter %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义内容</title>
<style>
</style>
</head>
<body>
<p>方法里面传参:{% current_time %}</p>
<p>页面直接传参:{% current_time1 '%Y年%m月%d日 %H:%M:%S' %}</p>
<p>上下文传参:{% current_time2 %}</p>
</body>
</html>

自定义包含标签

包含标签的功能是可以通过渲染另外一个模板来显示一些数据
例如很多地方都可能会用到下面这几行代码,除了choices这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.
<ul>
    {% for i in choices %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

定义一个show_tags的html文件

% for foo in choice %}
<li>foo</li>
{% endfor %}

在views中添加一个列表:

from django.shortcuts import render

def diy_filter(request):
return render(request, 'DIY/diy.html', context={
'list':['apple', 'pear', 'orange'],
})

my_filter中:

from django import template
from datetime import datetime
register = template.Library() # 包含标签
@register.inclusion_tag('DIY/show_tags.html')
def tags1():
li = ['a', 'b', 'c']
return {'choice': li} @register.inclusion_tag('DIY/show_tags.html')
def tags2(li):
return {'choice': li} @register.inclusion_tag('DIY/show_tags.html', takes_context=True)
def tags3(context):
return {'choice': context.get('list')}

html中

{% load my_filter %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义内容</title>
<style>
</style>
</head>
<body>
<p>方法里面传参:{% tags1 %}</p>
<p>content里面传参:{% tags2 list %}</p>
<p>上下文传参:{% tags3 %}</p>
</body>
</html>

最新文章

  1. Sticky Footer (让页脚永远停靠在页面底部,而不是根据绝对位置)
  2. PHP:错误 Deprecated: Function split() is deprecated in ... 解决办法
  3. 转response.sendRedirect()与request.getRequestDispatcher().forward()区别
  4. MySQL 面试基础
  5. 如何将excel文件中的数百万条数据在1分钟内导入数据库?
  6. Java中两个List对比的算法
  7. .Net Ajax跨域请求实现
  8. 比较Maven和Ant
  9. 禁用 urllib3 的安全请求警告
  10. (二分查找 拓展) leetcode278. First Bad Version
  11. LR12中针对WebServices协议的三种脚本开发模式
  12. 使用JSR-303进行校验
  13. 【Selenium】【BugList5】chrom窗口未关闭,又新开窗口,报错:[8564:8632:0522/111825.341:ERROR:persistent_memory_allocator.cc(845)] Corruption detected in shared-memory segment.
  14. centos7下安装docker(23.docker-swarm之如何访问service)
  15. pycharm 注册码/License server 2017年最新
  16. Gym-101102-K-Topological Sort
  17. Android Studio中关于9-patch格式图片的编译错误
  18. Android实践项目汇报总结(下)
  19. Linux-Load Average解析
  20. CodeForces - 1093G:Multidimensional Queries (线段树求K维最远点距离)

热门文章

  1. [Django基础] gunicorn启动django时静态文件的加载
  2. POJ2449 Remmarguts&#39; Date 第K短路
  3. Python三次登陆
  4. PCB MS SQL 标量函数与表值函数(CLR) 实现文件与目录操作
  5. eclipse ------validation功能
  6. python抢票开发——设备预约助手实现
  7. 51nod 1340 差分约束
  8. 胖ap和瘦ap的区别
  9. Linux egrep命令
  10. struts2.1.6存在中文乱码的bug