Django过滤器、标签语法、自定义过滤器、自定义标签、模板的导入和继承、静态文件配置及inclusion_tag

1、过滤器

1.1、常用过滤器
# 基本用法
1{{参数1|过滤器名字:参数2}}
2、过滤器最多传两个值,最少一个值  {{'hello world'|slice:'2:3'}}

<p>过滤器之filesizeformat: {{ num|filesizeformat }}</p>
<p>过滤器之slice: {{ str|slice:"7:11" }}</p>
第二个参数写012, 都是 ...,  最少从3开始
<p>过滤器之truncatechars: {{ str|truncatechars:'30' }}</p>
<p>truncatewords: {{ str|truncatewords:'2' }}</p>
<p>过滤器之date: {{ ctime|date:'Y年m月d日-------H时i分s秒' }}</p>
<p>过滤器之safe: {{ link1|safe }}</p>
1.2、过滤器大全
1、add: 将value的值增加2。使用形式为:{{ value | add: "2"}}2、addslashes: 在value中的引号前增加反斜线。使用形式为: {{ value | addslashes }}3、capfirst: value的第一个字符转化成大写形式。使用形式为: {{ value | capfirst }}4、cut: 从给定value中删除所有arg的值。使用形式为: {{ value | cut:arg}}5、date: 格式化时间格式。使用形式为: {{ value | date:"Y-m-d H:M:S" }}

6、default: 如果value是False,那么输出使用缺省值,使用形式: {{ value | default: "nothing" }}。例如,如果value是“”,那么输出将是nothing

7、default_if_none: 如果value是None,那么输出将使用缺省值。使用形式: {{ value | default_if_none:"nothing" }},例如,如果value是None,那么输出将是nothing

8、dictsort: 如果value的值是一个字典,那么返回值是按照关键字排序的结果
使用形式: {{ value | dictsort:"name"}},例如,
如果value是: 
[{'name': 'python'},{'name': 'java'},{'name': 'c++'},]
那么,输出是: 
[{'name': 'c++'},{'name': 'java'},{'name': 'python'}, ]

9、dictsortreversed: 如果value的值是一个字典,那么返回值是按照关键字排序的结果的反序。使用形式: 与dictsort过滤器相同。

10、divisibleby: 如果value能够被arg整除,那么返回值将是True。使用形式: {{ value | divisibleby:arg}},如果value是9,arg是3,那么输出将是True

11、escape: 替换value中的某些字符,以适应HTML格式。使用形式:{{ value | escape}}。例如,< 转化为 &lt;> 转化为 &gt;' 转化为 &#39;" 转化为 &quot;

13、filesizeformat: 格式化value,使其成为易读的文件大小。使用形式:{{ value | filesizeformat }}。例如:13KB,4.1MB等。

14、first: 返回列表/字符串中的第一个元素。使用形式:{{ value | first }}

16、iriencode: 如果value中有非ASCII字符,那么将其进行转化成URL中适合的编码,如果value已经进行过URLENCODE,改操作就不会再起作用。使用形式: {{value | iriencode}}

17、join: 使用指定的字符串连接一个list,作用如同python的str.join(list)。使用形式: {{ value | join:"arg"}},如果value是['a','b','c'],arg是'//'那么输出是a//b//c

18、last: 返回列表/字符串中的最后一个元素。使用形式: {{ value | last }}

19、length: 返回value的长度。使用形式: {{ value | length }}

20、length_is:如果value的长度等于arg的时候返回True。使用形式:{{ value | length_is:"arg"}}。例如:如果value是['a','b','c'],arg是3,那么返回True

21、linebreaks: value中的"\n"将被<br/>替代,并且整个value使用</p>包围起来。使用形式:{{value|linebreaks}}

22、linebreaksbr: value中的"\n"将被<br/>替代。使用形式: {{value |linebreaksbr}}

23、linenumbers: 显示的文本,带有行数。使用形式: {{value | linenumbers}}

24、ljust: 在一个给定宽度的字段中,左对齐显示value。使用形式: {{value | ljust}}

25、center: 在一个给定宽度的字段中,中心对齐显示value。使用形式: {{value | center}}

26、rjust: 在一个给定宽度的字段中,右对齐显示value。使用形式: {{value | rjust}}

27、lower: 将一个字符串转换成小写形式。使用形式: {{value | lower}}

30、random: 从给定的list中返回一个任意的Item。使用形式: {{value | random}}

31、removetags: 删除value中tag1,tag2....的标签。使用形式: {{value | removetags:"tag1 tag2 tag3..."}}

32、safe: 当系统设置autoescaping打开的时候,该过滤器使得输出不进行escape转换。使用形式: {{value | safe}}

33、safeseq: 与safe基本相同,但有一点不同的就是: safe是针对字符串,而safeseq是针对多个字符串组成的sequence

34slice: 与python语法中的slice相同。使用形式: {{some_list | slice:"2"}}

37、striptags: 删除value中的所有HTML标签.使用形式: {{value | striptags}}

38、time: 格式化时间输出。使用形式: {{value | time:"H:i"}}或者{{value | time}}

39、title: 转换一个字符串成为title格式。

40、truncatewords: 将value切成truncatewords指定的单词数目。使用形式: {{value | truncatewords:2}}。例如,如果value是Joel is a slug 那么输出将是: Joel is ...

42、upper: 转换一个字符串为大写形式

43、urlencode: 将一个字符串进行URLEncode

46、wordcount: 返回字符串中单词的数目

2、标签语法

2.1、for循环
2.1.1、views.py
def index(request):
    ll=['allen','jack','tom','lily','lily']
    # ll=[]
    dic={'name':'allen','age':19}
    user_list=[{'name':'allen','age':19},{'name':'jack','age':18},{'name':'张三','age':22},{'name':'李四','age':99},{'name':'tom','age':18},{'name':'lily','age':18}]
    return render(request, 'index.html', locals())
2.1.2、index.html
<h1>模板语法之标签</h1>

<h2>for的用法</h2>
{% for l in ll %}
    {#    <p>{{ l }}</p>#}
    <p><a href="http://127.0.0.1:8080/{{ l }}">{{ l }}</a></p>
{% endfor %}

<h2>处理字典的方法</h2>
{% for foo in dic.keys %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in dic.values %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in dic.items %}
    <p>{{ foo }}</p>
{% endfor %}

{% for k,v in dic.items %}
    <p>key值为:{{ k }},value值为{{ v }}</p>
{% endfor %}

<h2>处理列表套字典的方法</h2>
<table border="1">
    <tr>
        <td>id号</td>
        <td>用户名</td>
        <td>年龄</td>
    </tr>
    {% for dic in user_list %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ dic.name }}</td>
            <td>{{ dic.age }}</td>
        </tr>
    {% endfor %}
</table>

<h2>for...empty...的用法</h2>
<ul>
    {% for l in ll %}
        <li>{{ l }}</li>
    {% empty %}
        <li>没有数据</li>
    {% endfor %}
</ul>

<h2>forloop对象</h2>
{% for dic in user_list %}
    {% for key,value in dic.items %}
        {{ forloop.parentloop.counter }}
        <p>{{ key }}:{{ value }}</p>
    {% endfor %}
{% endfor %}
2.2、if语句
2.2.1、view.py
def index(request):
    # flag=False
    flag=True
    return render(request, 'index.html', locals())
2.2.2、index.html
<h2>if分支</h2>
{% if flag %}
    <p>flag是true</p>
{% else %}
    <p>flag是false</p>
{% endif %}
2.3、with重命名
2.3.1、view.py
def index(request):
    helloworldstr = 'hello world'
    return render(request, 'index.html', locals())
2.3.2、index.html
{% with helloworldstr as a %}
{{ a }}  <!--使用别名-->
{{ helloworldstr }}  <!--也可以不使用别名-->
{% endwith %}
2.4、csrf
<h2>csrf</h2>
{% csrf_token %}
<!--会默认生成一个名叫csrfmiddlewaretoken隐藏域,每次刷新值都不一样-->
<input type="text" name="csrfmiddlewaretoken" value="uC35XuP1J2Va74ArYiNw4TMZ0PaZ6V4qvVGCsUQcqiKF5Sr8IrWS0rzpmOmPBrjY">

3、自定义过滤器和自定义标签

3.1、自定义过滤器
第一步: 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的过滤器
第二步: 在app中创建templatetags包(包名只能是templatetags,不能修改)
第三步: 在包内,新建py文件(如: my_tags.py)
第四步: 写代码(以将字符串变大写为例的过滤器)
from django import template
register = template.Library()
@register.filter
def my_upper(value):
    return value.upper()
第五步使用: (模板),先load,再使用
{% load my_tags %}
{{ 'username'|my_upper }}
3.2、自定义标签
第一步: 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
第二步: 在app中创建templatetags包(包名只能是templatetags,不能修改)
第三步: 在包内,新建py文件(如:my_tags.py)
第四步: 写代码(以csrf_token为例的标签和计算数字和的标签)
from django import template
register = template.Library()
@register.simple_tag
def my_csrf():
    import uuid
    res=uuid.uuid4()
    return mark_safe('<input type="hidden" name="csrfmiddlewaretoken" value="%s">'%res)

@register.simple_tag
def my_add_tag(a, b, c):
    return a + b + c
第五步使用: (模板),先load,再使用
{% load my_tags %}
{% my_csrf %}
{% my_tag 1 3 4 %}

4、模板的导入和继承

4.1、模板的导入
第一步: 新建一个 xx.html,把模板写入(需要被导入的文件)
第二步: 在你想用的地方执行:
{% include 'xx.html' %}
4.2、模板的继承(母版)
第一步: 写一个母版,写空盒子
{% block top %}

{% endblock %}
第二步: 某个页面要使用母版,引入,扩写盒子
{% extends 'base.html' %}
{% block top %}
	index页面
{% endblock %}

补充: 如果需要保留母版中的数据,在对应的block块中执行:
{{ block.super }}

5、静态文件的配置方法

# 三种方式(以引入bootstrap为例)
第一种:
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
第二种:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
第三种:
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}bootstrap/css/bootstrap.min.css">

# 特殊用法(起别名)
# 方式一
{% load static %}
{% static "images/myphoto.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

# 方式二
{% load static %}
{% get_static_prefix as static %}
<img src="{{ static }}images/myphoto.jpg" alt="Hi!" />

# 方式一
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css'  as bootstrap %}">
<link rel="stylesheet" href="{{ bootstrap }}">

# 方式二
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix as static %}">
<link rel="stylesheet" href="{{ static }}bootstrap/css/bootstrap.min.css">

6、inclusion_tag

# 可以生成一片模板中的代码块
# 使用:5步
第一步: 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
第二步: 在app中创建templatetags包(包名只能是templatetags,不能修改)
第三步: 在包内,新建py文件(如: my_tags.py)
第四步: 写代码(inclusion_tag)
# inclusion_tag,传一个模板文件
@register.inclusion_tag('left.html')
def left(num):
    # dic={0:第0页,1:第1页,2:第2页}
    dic = {i: '第%s页' % i for i in range(num)}
    # 固定返回的必须是字典
    print(dic)
    return {'data': dic}

@register.inclusion_tag('beautiful.html')
def beautiful(title, url):
    return {'title': title, 'url': url}
第五步使用:(模板),先load,再使用
{% load my_tags %}
{% left 5%}
{% beautiful '名字' '地址'%}
        
        
# 它跟tag有什么不同?
1、tag需要在代码中写html文件
2、inclusion_tag代码跟模板分离
6.1、实例演示
6.1.1、my_prev.py文件
@register.inclusion_tag('index1.html')
def my_temp_tag(num):
    res = {i: '第{}页'.format(i) for i in range(num)}
    return {'data': res}  # 必须返回字典
6.1.2、index1.html文件
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<ul>
    {% for key,value in data.items %}
        <li><a href="http://127.0.0.1/{{ key }}">{{value }}</a></li>
    {% endfor %}
</ul>
</body>
</html>
6.1.3、视图模板文件
{% load my_prev %}
<p>{% my_temp_tag 10 %}</p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值