Django学习之路05

Django模板层

模板层语法(两类)

变量相关:{{    }}

逻辑相关:{{    }}

给模板传值的方法

#方法1
#通过字典传值,指名道姓,例如下
return render(request,'reg.html',{'n':n,'f':f})

#方法2
return render(request,'reg.html',locals())
#locals()会将它所在名称空间中的所有名字全部传给前端
#缺点是如果你的前端并不需要那么多数据就会造成资源的浪费

变量相关

经过测试,python中的整型,浮点型,字符串,列表,字典,元组以及集合都可以传给前端

#模板中支持的写法
{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}

补充:也可以传函数名,会自动加括号调用改函数,前端会展示函数调用之后的返回值,如果函数需要传参的话,那么不可以,因为模板语法还不支持。

模板语法之过滤器

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

过滤器的语法: {{ value|filter_name:参数 }}

使用管道符"|"来应用过滤器。

#length
{#<p>{{ l|length }}返回值的长度</p>#}

#default
{#<p>{{ ss|default:'当|左边的变量为空就会返回|右边的值' }}default跟你后端get方法很像</p>#}
{#<p>{{ ss|default:'' }} default必须要有两个参数</p>#}

#filesizeformat
{#<p>{{ file_size|filesizeformat }}将值转化成一个文件大小</p>#}

#trunchatewords
{#<p>{{ info|truncatewords:3 }} 就是按空格截取  三个点不算</p>#}

#truncatechars
{#<p>{{ info|truncatechars:6 }}按字符截取内容 三个点也算</p>#}

#dare
{#<p>{{ ctime|date:'Y-m-d' }} 只需要掌握年月日就可以了</p>#}

#add
{#<p>{{ n|add:100 }}</p>#}
{#<p>{{ s|add:'hahah 翻车啦' }}加</p>#}

#slice
{#<p>{{value|slice:"2:1"}}切片,顾头不顾尾,可以规定步长</p>#}
#safe
{#<p>{{ xxx|safe }}</p>#}
{#<p>{{ yyy|safe }}</p>#}
"""
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,为了在Django中关闭HTML的自动转义,我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
"""

自定义过滤器

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

  • 变量(输入)的值 - -不一定是一个字符串
  • 参数的值 - 这可以有一个默认值,或完全省略

例如,在过滤器{{var | foo:'bar'}}中,过滤器foo将传递变量var和参数“bar”

#自定义顾虑器的存放位置
app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package
        __init__.py
        app01_filters.py  # 建一个存放自定义filter的文件
    views.py
#编写自定义过滤器
from django import template
register = template.Library()


@register.filter(name="cut")
def cut(value, arg):
    return value.replace(arg, "")


@register.filter(name="addSB")
def add_sb(value):
    return "{} SB".format(value)
#在前端使用自定义过滤器
{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}

{# 使用我们自定义的filter #}
{{ somevariable|cut:"0" }}
{{ d.name|addSB }}

模板语法之标签

for循环

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

关于forloop

if判断

{% for foo in '' %}
    {% if forloop.first %}
        <p>这是我的第一次</p>
        {% elif forloop.last %}
        <p>这是最后一次了啊</p>
        {% else %}
        <p>来啊来啊!!!</p>
    {% endif %}
    {% empty %}
    <p>当for循环的对象为空的时候 会走empty</p>
{% endfor %}

with

定义一个中间变量,多用于给一个复杂的变量起别名。

注意等号左右不要加空格。

{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

自定义标签

# 自定义标签
# 支持传多个值
@register.simple_tag(name='jason')
def xxx(a,b,c,year):
    return '%s?%s|%s{%s'%(a,b,c,year)

# 自定义inclusion_tag
"""
接收用户传入的参数  然后作用于一个html页面
在该页面上渲染数据 之后将渲染好的页面
放到用户调用inclusion_tag的地方
"""

# 自定义inclusion_tag
@register.inclusion_tag('bigplus.html')
def bigplus(n):
    l = []
    for i in range(n):
        l.append('第%s项'%i)
    return {'l':l}
#前端
<ul>
    {% for foo in l %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>

模板的继承与导入

#首先需要再被继承的模块中划分多个区域
{% block 给区域起的名字 %}

{% endblock %}

#通常情况下一个模板中应该至少有三块
{% block css %}
页面css代码块
{% endblock %}

{% block js %}
页面js代码块
{% endblock %}

{% block contet %}  #注意起的名字不加引号
    页面主题内容
{% endblock %}

子板继承模板

#先继承模板所有的内容
{% extends 'home.html' %}

#然后根据block块的名字修改指定区域的内容
{% block content %}
    <form action="">
    <p>username:<input type="text" class="form-control"></p>
    <p>password:<input type="text" class="form-control"></p>
    </form>
{% endblock %}

模板的导入:将一段html当做模块的方式导入另一个html展示

{%  include '想导入的html文件名' %}

猜你喜欢

转载自www.cnblogs.com/wangnanfei/p/11545065.html
今日推荐