django之模板层

注意:

1,模板层语言注释:前端看不到

2,相当于Print了该变量

3,只写函数名,在模板里面相当于执行该函数

4,模板中不能调用有参函数的方法

5,深入查询:统一要用句点符

一,变量

在模板中

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>模板层</title>
</head>
<body>
<h1>模板层</h1>
<hr>
<h2>模板语言之变量</h2>
<p>字符串:{{ name }}</p>
<p>数字:{{ age }}</p>
<p>列表{{ li }}</p>
<p>元组:{{ tu }}</p>
<p>字典:{{ dic }}</p>
{# 只写函数名,相当于执行该函数#}
<p>函数:{{ test }}</p>
{# 如果只写对象名,则显示的是对象的内存地址#}
<p>对象: {{ lqz }}</p>
<p>列表套对象:{{ person_list }}</p>
<p>字典套对象:{{ person_dic }}</p>
<hr>
<h2>深度查询</h2>
<p>列表的第0个值</p>
<p>列表第3个值:{{ ll.3 }}</p>
<p>字典取值:{{ dic.name }}</p>
<p>字典取列表值:{{ dic.ll }}</p>
{#  想要继续取值,则继续往下点就好了#}
<p>对象取数据属性:{{ lqz.name }}</p>
<p>对象取绑定给对象的函数属性:{{ lqz.get_name }}</p>
<p>对象取绑定给类的函数属性:{{ lqz.cls_test }}</p>
<p>对象取静态方法:{{ lqz.static_test }}</p>
<p>把对象列表中egon年龄取出来:{{ person_list.1.age }}</p>
<h2>字符串的方法(了解)</h2>
<hr>
<p>字符串的方法:{{ name.upper }}</p>
<hr>


</body>
</html>

在视图中设置

from django.shortcuts import render, HttpResponse, redirect
from django.http import JsonResponse


# Create your views here.

# def index(request):
#     l = [{'name': 'lqz', '年龄': 18}, {'姓名': 'lqz2', 'age': 18}]
#     return JsonResponse(l, safe=False, json_dumps_params={'ensure_ascii': False})

def index(request):
    name = 'jack'
    age = '20'
    l1 = [1, 2, 'lily']
    ll2 = []
    dic2 = {}
    tu = (1, 2, 3)
    dic = {'name': 'lqz', 'age': 18, 'll': [1, 2, 4]}

    # 函数
    def test():
        print('执行此函数')
        return 'test 的返回值'

    # 类和对象
    class Person():
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def get_name(self):
            return '类Person中的get_name方法的返回值'

        @classmethod
        def cls_test(cls):
            return '类Person中的cla_test方法的返回值'

        @staticmethod
        def static_test():
            return '类Person中的static_test方法的返回值'

        # 模板中不可以执行带参数的方法
        def get_name_cs(self, tt):
            return self.name

    lqz = Person('lqz', 18)
    egon = Person('egon', 18)
    person_list = [lqz, egon]
    person_dic = {'lqz': lqz}

    file_size = 1024
    import datetime
    ctim = datetime.datetime.now()

    h1 = '<h1>你好</h1>'
    # 导入这个之后,直接把文本转换成html文件可以解析的语句
    # 导入from django.utils.safestring import mark_safe
    # h1 = mark_safe(h1)
    script = '<script>alert(111)</script>'

    # user='lqz'
    user = ''
    return render(request, 'index.html', locals())

二,过滤器

语法:{{ 第一个参数|过滤器名字:第二个参数 }}

<h1>模板语言之过滤器</h1>
{#后面就是个python中的函数,|前面的,是函数的第一个参数,冒号后面的是第二个参数#}
<p>统计字符串长度:{{ name|length }}</p>
<p>统计列表长度:{{ ll|length }}</p>
{# 当前面的列表或者字符串为空的时候才能返回设置的默认值 #}
<p>过滤器之默认值:{{ ll2|default:'没有值' }}</p>
{# filesizeformat把前面的数值转换成可读的单位,一般字符串里面也是数值 #}
<p>
    过滤器之filesizeformat--1:{{ 2013344444444444444444444445555444444444444444444444444444444444444444444444444444444444443|filesizeformat }}</p>
<p>过滤器之filesizeformat--2:{{ file_size|filesizeformat }}</p>
{# ctim是把后台传过来的数据,完整的打印在页面上面,使用data之后,就把ctim时间规范成后面自定义的格式 #}
<p>过滤器之不使用date:{{ ctim }}</p>
<p>过滤器之date:{{ ctim|date:'Y-m-d' }}</p>
{#前闭后开区间#}
<p>过滤器之slice:{{ ll|slice:'2:-1' }}</p>
{#支持步长#}
<p>过滤器之slice-字符串:{{ name|slice:'0:3:3' }}</p>
{#三个起步,显示da...#}
<p>过滤器之truncatechars:{{ 'dafddfafgadfgaasdgadgfadaf'|truncatechars:5 }}</p>
{# 这个显示从开始数五个单词... #}
<p>过滤器之truncatewords:{{ '我 dfaf ga dfgaas 你 dgf adaf'|truncatewords:5 }}</p>
{# 不加safe,django不会解析后台的数据,直接输出,加了safe之后,页面可以解析后台的数据比如:<h1></h1> #}
<p>过滤器之不用safe:{{ h1 }}</p>
<p>过滤器之用safe:{{ h1|safe }}</p>

<p>过滤器之不用safe:{{ script }}</p>
{#<p>过滤器之用safe:{{ script|safe }}</p>#}
{# add把传入的两个整数进行相加,传入的两个字符串进行拼接 #}
<p>过滤器之用add:{{ 12|add:'1' }}</p>
<p>过滤器之用add:{{ 'egon'|add:'dsb' }}</p>

三,标签

for循环标签   if条件标签   with是重命名标签

<h2>模板语言之标签</h2>
{% for foo in ll %}
    {{ forloop }}
{# forloop里面的值,具体如下 #}
{# parentloop:for循环父级的这些全部内容,counter0:从0开始计数,counter:从1开始计数,revcounter:倒着计数,末尾为1,revcounter0:倒着计数,末尾为0 #}
<p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
{% endfor %}

{% for foo in ll %}
    {% for i in person_list %}
  取出外层是第几次循环
        {{ forloop.parentloop.counter }}
        <p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
    {% endfor %}
{% endfor %}
**************循环的对象是空,才会走到empty,而不是对象里面的东西为空
{% for foo in dic2 %}
    <p>{{ foo }}</p>
    {% empty %}
    <p>傻逼了</p>
{% endfor %}
只循环字典的话,取到的是key值
{#{% for foo in dic %}#}
取到value的值
{#{% for foo in dic.values %}#}
取到key 和 value的值
{# 当循环的是个空列表的时候,才执行empty函数 #}
{% for k,foo in dic.items %}
    <p>{{ k }}----->{{ foo }}</p>
    {% empty %}
    傻逼了
{% endfor %}

{% if user %}
    <a href="">退出</a>
    {% else %}
    <a href="">登录</a>
    <a href="">注册</a>
{% endif %}

for循环判断如果是第一次,打印第一次,其他打印正常值
{% for foo in ll %}
    {% if forloop.first %}
        <p>第一个参数 </p>
    {% elif forloop.last %}
        <p>最后一个参数 </p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
{% endfor %}

<hr>
{#with 相当于取别名,作用:变量太长,可以简化#}
{#{% with name as ttt %}#}
{#    {{ ttt }}#}
{#    {{ name }}#}
{#    {{ user }}#}
{##}
{#{% endwith %}#}
------
{% with dic.ll.2 as ttt %}
    {{ ttt }}

    {{ ttt }}

{% endwith %}

************************for ,if,with 都要有结束******************

四,自定义标签和过滤器

注意:标签不能用在if判断,过滤器可以用在if判断里面

自定义过滤器:

1,确定app是否在setting中注册
2 在app下创建一个templatetags的文件夹(模块)(****名字不能变***)
3 在模块下创建一个py文件,名字随意:mytag.py
4 # 第一步,导入template
	from django.template import Library
# 第二步,定义一个叫register的变量=template.Library()
	register = Library()
5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名)
	def str_add(str1, str2): #一定要有返回值
		# 业务逻辑很复杂
		return str1 + str2
6 在模板里:(新定定义的标签,过滤器,都要重启程序)
	-{% load mytag %}
	-{{'lqz'|str_add:'nb'}}

自定义标签

1,确定app是否在setting中注册
2 在app下创建一个templatetags的文件夹(模块)(****名字不能变***)
3 在模块下创建一个py文件,名字随意:mytag.py
4 # 第一步,导入template
	from django.template import Library
# 第二步,定义一个叫register的变量=template.Library()
	register = Library()
5 只是装饰器不一样
	@register.simple_tag()
		def add_nb(value):
		    return value+'nb'
6 在模板里:(多个参数,以空格区分)
	-{% load mytag %}
	-{% add_nb 'lqz'%}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值