企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] * * * * * # 常用语法 ## 变量 > 语法:视图:传递变量至模板;模板:接收变量; > 模版处理复杂结构变量,如:列表(list),字典(dictonary),自定义对象。在`Django`模版中遍历复杂数据结构的关键字是句点字符(.) > 视图:`return render(request, "HTML文件", {"模板变量1" : 变量1,"模板变量2": 变量2})` > 模板:`{{ 模板变量1 }}` >[info]说明:变量名由字母数字和下划线组成。 >[warning] 示例 >view中代码: ~~~Python def template_test(request): list = [11, 22, 33] dict = {"name": "alex"} class Person(object): def __init__(self, name, age): self.name = name self.age = age def dream(self): return "{} is dream...".format(self.name) Alex = Person(name="Alex", age=34) Egon = Person(name="Egon", age=9000) Eva_J = Person(name="Eva_J", age=18) person_list = [Alex, Egon, Eva_J] return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list}) ~~~ >[warning] 模板中支持的写法: ~~~Django {# 取list中的第一个参数 #} {{ list.0 }} {# 取字典中key的值 #} {{ dict.name }} {# 取对象的name属性 #} {{ person_list.0.name }} {# .操作只能调用不带参数的方法 #} {{ person_list.0.dream }} ~~~ ## Filters(过滤器) > 语法:`{{ value|filter_name:参数 }}` ### Defualt >[info] 如果value值没传的话就显示nothing ~~~Django {{ value|default: "nothing"}} ~~~ ### length >[info] 返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4. ~~~Django {{ value|length }} ~~~ ### filesizeformat >[info] 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。 >如果 value 是 123456789,输出将会是 117.7 MB。 ~~~Django {{ value|filesizeformat }} ~~~ ### slice >[info] 切片。 ~~~Django {{value|slice:"2:-1"}} ~~~ ### date >[info] 日期格式化。 ~~~Django {{ value|date:"Y-m-d H:i:s"}} ~~~ ### safe >[info] Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个> 内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的> > 源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。 > 比如: > `value = "<a href='#'>点我</a>"` > ~~~Django {{ value|safe}} ~~~ ### truncatechars >[info] Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个> 内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的> > 源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。 > 比如: > `value = "<a href='#'>点我</a>"` > ~~~Django {{ value|safe}} ~~~ ## 自定义filter > 自定义过滤器只是带有一个或两个参数的Python函数: > * 变量(输入)的值 - -不一定是一个字符串 > * 参数的值 - 这可以有一个默认值,或完全省略 > 例如,在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”。 >[warning] 自定义filter代码文件摆放位置: ~~~ app01/ __init__.py models.py templatetags/ # 在app01下面新建一个package package __init__.py app01_filters.py # 建一个存放自定义filter的文件 views.py ~~~ >[warning] 编写自定义filter: ~~~Python 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) ~~~ >[warning] 使用自定义filter: ~~~Django {# 先导入我们自定义filter那个文件 #} {% load app01_filters %} {# 使用我们自定义的filter #} {{ somevariable|cut:"0" }} {{ d.name|addSB }} ~~~ # 标签(TAGS) ## FOR(循环) >[info] 语法: ~~~Django 普通FOR循环 {% for 变量 in 视图变量 %} {{ 循环体 }} {% endfor %} 嵌套FOR循环 {% for 变量1 in 视图变量 %} {% for 变量2 in 变量1 %} {{ 循环体 }} {% endfor %} {% endfor %} ~~~ #### FORLOOP ##### counter > 表示当前循环的执行次数的整数计数器。该计数器从1开始,即第一次循环时{{% forloop.counter %}}的值为1 ##### counter0 > 计数从0开始,第一次循环其值为0 ##### revcounter > 表示循环中剩余项的整型变量。循环初次执行时 {{% forloop.revcounter %}}的值为循环项的总数 ##### revcounter0 > 以0做为结束索引。第一次执行其值为序列总数减1。最后一次执行时,其值为0 ##### first > 是一个布尔值,第一次执行时其值为true ##### last > 布尔值,最后一次执行时其值为true ##### parentloop > forloop.parentloop是一个指向当前循环的上一级循环的forloop对象的引用(嵌套循环情况下) #### FOR...EMPTY >[info] 语法: ~~~Django <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul> ~~~ ###### FOR循环例子 ~~~Django <ul> {% for item in menus %} {% if item.menulevel == "P" %} <div id="link"> <li> <a href="{{ item.link }}">{{ item.label }}</a> </li> {% endif %} {% for sub_item in item.left_set.all %} <div id="sub_link"> <li> <a href="{{ sub_item.link }}">{{ sub_item.label }}</a> </li> </div> {% endfor %} </div> {% endfor %} </ul> ~~~ ## IF(判断) >[info] 语法:普通IF判断 > 条件表达式支持:==,>,<,!=,>=,<= ~~~Django {% if 条件表达式 %} 执行语句 {% endif %} ~~~ >[info] 语法:多分支IF判断 ~~~Django {% if 条件表达式1 %} ... 执行语句1 {% elif 条件表达式2 %} ... 执行语句2 {% else %} ... 执行语句3 {% endif %} ~~~ >[info] 语法:复杂条件IF判断 > 支持:and(并且),or(或者),not(取反),in(包含) > if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。 ~~~Django {% if 条件1 and 条件2 %} 执行语句 {% endif %} ~~~ ## with(中间变量) 定义一个中间变量 ~~~Django {% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %} ~~~ ## csrf ## 注释 >[info] 语法:`{# .asdasdasd<p>.. #}` ## 3.2 母版 > 概念:把多个页面共用的部分提取出来,放在一个母版里。 ## 3.2.1 制作 > 在母版HTML内定义BLOCK(块),BLOCK用来存放动态内容。 >[info] 语法: ~~~Django 母版HTML {% block 块名称 %} {% endblock %} 子版HTML {% block 块名称 %} ...内容 {% endblock %} ~~~ ### 3.2.2 继承 ~~~Django {# 继承母版 #} {% extends 母版HTML %} ~~~ ### 3.2.3 组件 > 可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。 ~~~Django {% include 调用的HTML %} ~~~ ### 3.2.4 静态文件 ~~~Django {% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" /> ~~~ > 引用JS文件时使用: ~~~Django {% load static %} <script src="{% static "mytest.js" %}"></script> ~~~ > 某个文件多处被用到可以存为一个变量: ~~~Django {% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img> ~~~ #### 使用get_static_prefix ~~~Django {% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" /> ~~~ > 或者 ~~~Django {% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /> <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" /> ~~~ ### 自定义simpletag > 和自定义filter类似,只不过接收更灵活的参数。 > 定义注册simple tag ~~~ @register.simple_tag(name="plus") def plus(a, b, c): return "{} + {} + {}".format(a, b, c) ~~~ 使用自定义simple tag ~~~ {% load app01_demo %} {# simple tag #} {% plus "1" "2" "abc" %} ~~~ ### inclusion_tag > 多用于返回html代码片段 > 示例: > templatetags/my_inclusion.py ~~~ rom django import template register = template.Library() @register.inclusion_tag('result.html') def show_results(n): n = 1 if n < 1 else int(n) data = ["第{}项".format(i) for i in range(1, n+1)] return {"data": data} ~~~ > templates/snippets/result.html ~~~ <ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul> ~~~ > templates/index.html ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>inclusion_tag test</title> </head> <body> {% load inclusion_tag_test %} {% show_results 10 %} </body> </html> ~~~