美文网首页
57.3-Django模板之DTL使用(前后端混写)

57.3-Django模板之DTL使用(前后端混写)

作者: BeautifulSoulpy | 来源:发表于2020-08-06 19:13 被阅读0次

生命是一个过程,可悲的是它不能重来。一个人,一辈子,一条路,一片天,随着年龄的增长,观点,心态,也就随之改变!


总结:

  1. 对于字典dict(keys,values,items),dict.a相当与dict的key访问;记住:数据的访问基本上都用点;()、[]都不能用在{{}}中;
  2. &lt; 等价于 < ;
  3. csrf_token 表单隐藏控件,post提交的时候 如果采用form表单,提交的时候会将hidden一并传回来

模板中插入 更加复杂的数据需要用到 Django的专属语言DTL;混写前后端不推荐使用;
JSP\ASP\PHP

1. DTL语法(属于前后端 混写方式)

变量\标签\注释\过滤器

1 变量
语法 {{ variable }}

变量名由字母、数字、下划线、点号组成。
点号使用的时候,例如foo.bar,遵循以下顺序:

  1. 字典查找,例如foo["bar"],把foo当做字典,bar当做key
  2. 属性或方法的查找,例如foo.bar,把foo当做对象,bar当做属性或方法
  3. 数字索引查找,例如foo[bar],把foo当做列表一样,使用索引访问
from django.conf.urls import url
from django.contrib import admin
from django.http import HttpRequest, HttpResponse, JsonResponse
from django.template import loader
from django.template.backends.django import  Template
from django.shortcuts import  render

class School:
    def __init__(self):
        self.name = 'magedu.net'

def index(request:HttpRequest):
    """视图函数:请求进来返回响应"""
    context = {'school':School(),
               'name':'magedu',
               'testlist':list(range(10,20)),
               'testdict':{'a':100,'b':'abc','c':School(),'d':list(range(1,8))}}   #正文字符串  数据传输

    return render(request,'index.html',context,status=201)
    # dict key调用

urlpatterns = [
    url(r'^admin/', admin.site.urls),   # 正则表达式模式匹配
    url(r'^$', index),   # 以它开头、结尾的;
    url(r'^index$', index),  # 以 index开头 index1、index/ ;
    # 两个不同的函数指向同一个问题url;不是多对多;
]

// html
    {{school}}} <br>
    {{school.name}}<br>
    {{testlist}}<br>
    {{testdict.c.name}}

如果变量未能找到,则缺省插入空字符一串
在模板中调用方法,不能加小括号,自然也不能传递参数;
{{my_dict.a}}符合第一条,当作字典的key就可以访问到了;
{{ my_dict.keys }} 访问所有的key这样是对的,不能写成{{ my_dict.keys() }}。符合第二条,当做my_dict对象的属性或方法。

2. 模板标签
2.1 if/else 标签

基本语法格式如下:

{% if condition %}
  ... display
{% endif %}

或者:
{% if condition1 %}
  ... display 1
{% elif condition2 %}
  ... display 2
{% else %}
  ... display 3
{% endif %}

// 实例
{% if testdict.a > 50 %}
    {{testdict.a}} <br>      
    &lt;=50 
#-------------------------------------
100
<=50

条件也支持and、or、not

注意,因为这些标签是断开的,所以不能像Python一样使用缩进就可以表示出来,必须有个结束标签,例如 endif、endfor。


2.2 for 标签

https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#for

<ul>
{%for k in testdict.keys%}
<li>testdict key={{k}}}</li>
{% endfor %}
    </ul>
#------------------------------------------------------------------------
testdict key=a}
testdict key=b}
testdict key=c}
testdict key=d}

// 反转列表 reversed
<ul>
{%for k in testlist reversed%}
<li>{{forloop.counter0}}  key={{k}}}</li>          // forloop.revcounter0   反转 序号;
{% endfor %}
    </ul>
#------------------------------------------------------
0 key=19}
1 key=18}
2 key=17}
3 key=16}
4 key=15}
5 key=14}
6 key=13}
7 key=12}
8 key=11}
9 key=10}

    {{forloop.first}}   // 是否第一行
    {{forloop.last}}   // 是否最后一行

变量 说明
for loop.counter 当前循环从1开始的计数
for loop.counter 0 当前循环从0开始的计数
for loop.rev counter 从循环的末尾开始倒计数到1
for loop.rev counter 0 从循环的末尾开始到计数到0
for loop.first 第一次进入循环
for loop.last 最后一次进入循环
for loop.parent loop 循环嵌套时,内层当前循环的外层循环

给标签增加一个 reversed 使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}
...
{% empty %}
... 如果被迭代的列表是空的或者不存在,执行empty
{% endfor %}

可以嵌套使用 {% for %} 标签:

{% for athlete in athlete_list %}
  <h1>{{ athlete.name }}</h1>
  <ul>
  {% for sport in athlete.sports_played %}
    <li>{{ sport }}</li>
  {% endfor %}
  </ul>
{% endfor %}

2.3 ifequal/ifnotequal 标签

{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}
  <h1>Welcome!</h1>
{% endifequal %}

和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:

{% ifequal section 'sitenews' %}
  <h1>Site News</h1>
{% else %}
  <h1>No News Here</h1>
{% endifequal %}

其他标签
csrf_token 用于跨站请求伪造保护,防止跨站攻击的。
表单控件,post提交的时候 如果采用form表单,提交的时候会将hidden一并传回来;

{% csrf_token %}
3. 注释标签

单行注释{##}。
多行注释{%comment%} ...{%end comment%}

{# 这是一个注释 #}

{% comment %}
这是多行注释
{% endcomment %}.
4. 过滤器()

模板过滤器可以在变量被显示前修改它。
推荐 数据在使用之前就准备好,不需要管道 的 临时操作;

语法 {{ 变量|过滤器 }}
  1. 过滤器使用管道字符 | ,例如{{ name|lower }},{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

  2. 过滤管道可以被套接 ,一个过滤器管道的输出又可以作为下一个管道的输入,例如{{ my_list|first|upper }},将列表第一个元素并将其转化为大写。

过滤器传参

有些过滤器可以传递参数,过滤器的参数跟随冒号之后并且总是以双引号包含。

例如:{{ bio|truncatewords:"30" }},截取显示变量 bio 的前30个词。
{{ my_list|join:"," }},将my_list的所有元素使用,逗号连接起来
其他过滤器
过滤器 说明 举例
first 取列表第一个元素
last 取列表最后元素
yesno 变量可以是True、False、None
yesno的参数给定逗号分隔的三个值,返回3个值中的一个。
True对应第一个
False对应第二个
None对应第三个
如果参数只有2个,None等效False处理
{{ value | yesno:"yeah,no,maybe"}}
add 加法。参数是负数就是减法 数字加{{ value | add:"100"}}
列表合并{{mylist | add:newlist}}
divisibleby 能否被整除 {{value|divisibleby:3”}}能被3整除返回True
addslashes 在反斜杠、单引号或者双引号前面加上反斜杠 {{value|addslashes} }
length 返回变量的长度 {%if my_list|length>1%}
default 变量等价False则使用缺省值 {{value|default:”nothing”} }
default_if_none 变量为None使用缺省值 {{value|default_if_none:"nothing"}}
date 格式化date或者datetime对象 实例:{{my_dict.date|date:Y nj}}
Y2000年
n1~12月
j1~31日

时间的格式字符查看 https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#date

相关文章

网友评论

      本文标题:57.3-Django模板之DTL使用(前后端混写)

      本文链接:https://www.haomeiwen.com/subject/imttdktx.html