Django 模板语法

my_tags.py文件代码

!!!注意要在setting.py中的TEMPLATES里面设置'DIRS': [os.path.join(BASE_DIR, 'templates')], # 修改位置

from django import template
from django.utils.safestring import mark_safe

register = template.Library() #register的名字是固定的,不可改变

# 利用装饰器 @register.filter 自定义过滤器。
# 注意:装饰器的参数最多只能有 2 个。
@register.filter
def my_filter(v1, v2):
return v1 * v2

# 利用装饰器 @register.simple_tag 自定义标签。
@register.simple_tag
def my_tag1(v1, v2, v3):
return v1 * v2 * v3

# 定义标签时,用上 mark_safe 方法,令标签语义化,相当于 jQuery 中的 html() 方法。
# 和前端HTML文件中的过滤器 safe 效果一样。
@register.simple_tag
def my_html(v1, v2):
temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
return mark_safe(temp_html)

views.py文件代码

def runoob(request):
import datetime
views_name = "菜鸟教程"
views_dict = {"name": "菜鸟教程"}
views_list = ["菜鸟教程1", "菜鸟教程2", "菜鸟教程3"]
num = 1024
now = datetime.datetime.now()
views_str = "<a href='https://www.runoob.com/'>点击跳转</a>"
views_num = 98
views_dicts = {"name":"菜鸟教程","age":18}
views_clist = ["a", "b", "c", "d", "e"]
listvar=[]
return render(request, "runoob.html",
{"name": views_name, "views_list": views_list, "views_dict": views_dict, "num": num, "time": now,
"views_str": views_str,"nums":views_num,"views_dicts":views_dicts,"viewsClist":views_clist,
"listvar":listvar})

runoob.html文件代码

<!--模板语法
view:{"HTML变量名" : "views变量名"}
HTML:{{变量名}}-->
<p>{{ name }}</p>

<!--用 . 索引下标取出对应的元素。-->
<p>{{ views_list }}</p>
<p>{{ views_list.0 }}</p>

<!--用 .键 取出对应的值。-->
<p>{{ views_dict }}</p>
<p>{{ views_dict.name }}</p>

<!--length
返回对象的长度,适用于字符串和列表。-->
<p>{{ views_dict|length }}</p>

<!--filesizeformat-->
<!--以更易读的方式显示文件的大小(即'13 KB', '4.1 MB', '102 bytes'等)。-->
{{ num|filesizeformat}}

<!--date
根据给定格式对一个日期变量进行格式化。
格式 Y-m-d H:i:s返回 年-月-日 小时:分钟:秒 的格式时间。-->
{{ time|date:"Y-m-d" }}


<!--truncatechar如果字符串包含的字符总个数多于指定的字符数量,那么会被截断掉后面的部分。截断的字符串将以 ... 结尾。-->
{{ views_dict.name|truncatechars:2}}

<!--safe
将字符串标记为安全,不需要转义。
要保证 views.py 传过来的数据绝对安全,才能用 safe。
加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。-->
{{ views_str|safe }}


<!--根据条件判断是否输出。if/else 支持嵌套。-->
<!--标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:-->
{% if nums > 90 and nums < 100 %}
优秀
{% else %}
合格
{% endif %}


<!--与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。-->
<ul>
{% for i in views_list %}
<li>{{ i }}</li>
{% endfor %}
</ul>

<!--给标签增加一个 reversed 使得该列表被反向迭代:-->
{% for i in views_list reversed %}
{{i}}
{% endfor %}


<!--遍历字典: 可以直接用字典 .items 方法,用变量的解包分别获取键和值。-->
{% for i,j in views_dicts.items %}
{{ i }}---{{ j }}
{% endfor %}

<!--在 标签里可以通过 变量获取循环序号。-->
{% for i in viewsClist %}
{{ forloop.counter }} <!--顺序获取循环序号,从 1 开始计算-->
<!-- {{ forloop.counter0 }}&lt;!&ndash;顺序获取循环序号,从 0 开始计算 &ndash;&gt;-->
<!-- {{ forloop.revcounter }}&lt;!&ndash;倒叙获取循环序号,结尾序号为 1&ndash;&gt;-->
<!-- {{ forloop.revcounter0 }}&lt;!&ndash; 倒叙获取循环序号,结尾序号为 0&ndash;&gt;-->
<!-- {{ forloop.first }}&lt;!&ndash; 第一条数据返回 True,其他数据返回 False&ndash;&gt;-->
<!-- {{ forloop.last }}&lt;!&ndash; 最后一条数据返回 True,其他数据返回 False&ndash;&gt;-->
{% endfor %}

<!--可选的 从句:在循环为空的时候执行(即 in 后面的参数布尔值为 False )。-->
{% for i in listvar %}
{{ forloop.counter0 }}
{% empty %}
空空如也~
{% endfor %}

<!--ifequal/ifnotequal 标签 下面的例子比较两个模板变量 user 和 currentuser :-->
{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}

<!--在 HTML 中引入图片。-->
{% load static %}
<!--<img src="{% static "images/bjb.jpg" %}" alt="bjb.jpg">-->

<!--在 HTML 中使用自定义过滤器。-->
{% load my_tags %}
{{ 11|my_filter:22 }}

<!--在 HTML 中使用自定义标签。-->
{% my_tag1 11 22 33 %}

<!--在HTML中使用该自定义标签,在页面中动态创建标签。-->
{% my_html "zzz" "xxx" %}


<!--父模板标签 block...endblock: 父模板中的预留区域,该区域留给子模板填充差异性的内容,不同预留区域名字不能相同。。-->
<!--子模板使用标签 extends 继承父模板:-->
注意!!!!
调用时把下面代码放到页面最上面-
{%extends "base.html" %}
{% block mainbody %}
<p>继承了 base.html 文件</p>
{% endblock %}
<p>测试继承子模板</p>

posted @ 2020-08-12 15:46  徐12  阅读(166)  评论(0编辑  收藏  举报