array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 django 之模板层 - 爱码网

1. 模板语法之变量

  • 格式:{{ 变量名 }}
    句点符,深度查询(可以点到方法,不要加括号,只能是无参的方法)
  • 代码
视图函数:
from django.shortcuts import render
from django.utils.safestring import mark_safe
class Person:
    def __init__(self,name):
        self.name=name
    @classmethod
    def class_test(cls):
        print('class method')
        return 'class method'
    def test(self):
        print('method')
        return self.name
    # def __str__(self):
    #     return self.name
def index(request):
    ss='lqz is big'
    i=20
    ll=['lqz',18,[1,2,[2,3]]]
    ll4=[[1,2,3],[2,3,4],[1,2,9]]
    dic={'name':'lqz','age':18,'t':[1,2,[2,3]]}
    b=True
    lqz=Person('lqz')
    egon=Person('egon')
    xiaohou=Person('xiaohou')
    monkey=Person('monkey')
    ll2=[lqz,egon,xiaohou,monkey]
    dic2={'lqz':lqz,'egon':egon}
    # print(lqz.class_test())
    # print(dic['name'].upper)
    ll3=[]
    ss2=''
    ss3='<a href="https://www.baidu.com">点我</a>'  #链接
    ss3=mark_safe(ss3) #不用转义网页正常显示
    import datetime
    now=datetime.datetime.now()
    file=1024*1024*1024
    return render(request,'index.html',locals()) #locals渲染所有的内容
    # return render(request,'index.html',{'ss':ss,}) #指定单个内容渲染
模板:
<body>
<hr>
<p>字符串:{{ ss }}</p>
<p>数字:{{ i }}</p>
<p>列表:{{ ll }}</p>
句点符,做深度查询
<p>列表第2个值:{{ ll.2.2.0}}</p>
<p>布尔类型:{{ b}}</p>
<p>字典:{{ dic }}</p>
<p>字典取值:{{ dic.age }}</p>
<p>字典取值:{{ dic.t.2.1 }}</p>

<p>对象:{{ lqz }}</p>
<p>对象取值:{{ lqz.name }}</p>

执行方法,不要加括号,
<p>对象方法:{{ lqz.test }}</p>
<p>类方法:{{ lqz.class_test }}</p>
注释:前端看不到,django给处理了
{#<p>类方法:{{ Person}}</p>#}
<p>列表对象{{ ll2 }}</p>
<p>列表对象取值{{ ll2.1 }}</p>
<p>列表对象取值,在取值{{ ll2.1.name }}</p>
<p>对象字典{{ dic2 }}</p>
<p>对象字典取值{{ dic2.egon.name }}</p>
<p>空列表的情况{{ ll3 }}</p>
直接替换成空
<p>空字符串的情况{{ ss2 }}</p>

<p>a标签 {{ ss3 }}</p>
<h4>字典:{{ ss.upper }}</h4>
<h4>字典:{{ dic.name.upper }}</h4>

2.模板语法之过滤器

模板:
(1) date
注:冒号后不能加空格 now是第一个参数,冒号后面是第二个参数
<p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
<p>date过滤器 {{ now|date }}</p>

(2)default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>default过滤器  {{ ss2|default:'字符串没有值' }}</p>
<p>default过滤器  {{ ll3|default:'列表没有值' }}</p>

(3)length 返回值的长度。它对字符串和列表都起作用
<p>length过滤器  {{ ll2|length }}</p>

(4) filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
<p>filesizeformat过滤器  {{ file|filesizeformat }}</p>
<p>filesizeformat过滤器  {{ 1024|filesizeformat }}</p>

(5)slice 切片操作(同py数据类型切片)
<p>slice过滤器  {{ 'lqzisbig'|slice:'1:9' }}</p>

(6)truncatechars 截断字符
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
<p>truncatechars过滤器  {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p>
<p>truncatewords过滤器:  {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>

(7)safe   让django 不要转义网页,正常显示
<p>safe过滤器:  {{ ss3|safe }}</p>
{#可以在视图函数里处理 ss3 = mark_safe(ss3)#}

(8)add  俩参数可以传字符串和数字,具体详见源码
<p>add过滤器:  {{ 12|add:"3" }}</p>  结果:15
<p>add过滤器:  {{ 'eee'|add:"3rrr" }}</p> 结果:eee3rrr

3. 模板语法之标签

3.1 for 标签

<h1>模板语法之标签</h1>
{#   ll = ['lqz', 18, [1, 2, [2, 3]]]#}
{% for foo in ll %}
    <p>{{ forloop }}</p>
{#    循环序号可以通过{{forloop}}显示 #}
{#    {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 'revcounter0': 2, 'first': True, 'last': False}#}
    <p>{{ forloop.counter }}</p> #当前循环索引从1开始计数 123
    <p>{{ forloop.counter0 }}</p> #从0开始 012
    <p>{{ forloop.revcounter }}</p>  321
    <p>{{ forloop.revcounter0 }}</p> 210
    <p>{{ forloop.first }}</p>  #判断每次循环出的数是否是第一或者最后一次
    <p>{{ forloop.last }}</p>
{#    遍历每一个元素#}
    <p>{{ foo }}</p>
    
{#    判断实例:#}
    {% if forloop.first %}
        lqz is big
        {% elif forloop.last %}
        两人都小
        {% else %}
        egon is small
    {% endif %}
{% endfor %}   #必须要有结尾

#parentloop用法
{#   ll4 = [[1, 2, 3], [2, 3, 4], [1, 2, 9]]#}
{% for foo in ll4 %}
    {% for i in foo %}
       <p>{{ forloop }}</p>
{#        在内层循环中拿到外层循环的forloop#}
       <p>{{ forloop.parentloop }}</p>
   {% endfor %}
{% endfor  %}

# 循环出字典的值
            {% for i in dic.values %}
                <p>{{ i }}</p>

            {% endfor %}
            <hr>
            {% for i in dic.keys %}
                <p>{{ i }}</p>

            {% endfor %}
            <hr>
            {% for key,value in dic.items %}
                <p>{{ key }}---->{{ value }}</p>

            {% endfor %}

3.2 for... empty

  • 作用:for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作
<!--视图中ll3=[]-->
{% for foo in ll3 %}
    <p>{{ foo }}</p>
    {% empty %}  #要放在在for循环中,如果循环的对象为空,往下执行结果为'没有值'
    没有值
{% endfor %}

3.3 with

  • 作用:使用一个简单的名字缓存一个复杂的变量
{% with tt=dic.name %}
或者{% with dic.name as tt %}
    给取出的内容重新赋值给tt
    <p>{{ dic.name }}</p>
    <p>{{ tt }}</p>
{% endwith %}

3.4 if

  • 作用:{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}
注:if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

4. 自定义过滤器和标签

4.1 自定义过滤器

  • 步骤
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数 addstr(用register.filter()装饰)
7 模板内容:
	 {% load my_test %}
	 {{'lqz'|addstr:'isbig' }}  #最多只能传两个参数
  • 代码:
my_test文件:
from django import template
register=template.Library()
@register.filter(name=tt)
def addrstr(x,y):
    return x+y

模板:
<h1>自定义过滤器</h1>
{% load my_test %}
{#   过滤器可以是函数名,也可以是name指定的值 @register.filter(name=tt)#}
   {{ 'lqz'|addrstr:'isbig' }}  #lqzisbig 最多只能传两个参数

4.2 自定义标签

  • 步骤:
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数 
	@register.simple_tag(name='yy')
	def my_sum(x,y,z,i):
        return x+y+z+i
7 模板:
	{% load my_test %}
	{% yy 12 34 56 78 %}  #以空格做分割,传参数

代码:

my_test文件:
from django import template
@register.simple_tag(name='hh')
def sun(x,y,z):
    return x+y+z

模板:
{% load my_test %}
{% hh 5 4 7 %}   #以空格作分割,传参数
  • 自定义的过滤器,可以放在if判断里,
    自定义的标签,不能放在if判断里条件里

4.2 静态文件导入

方式一:
<link rel="stylesheet" href="/static123/mycss.css">
方式二:
{% load static %}
<link rel="stylesheet" href="{% static 'mycss.css'%}">
方式三:
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">

5. 模板导入与继承

5.1 模板导入

1 把公共部分,放到html里,比如叫 left.html
2 想在哪里用 导入{% include 'left.html' %}

5.2 模板继承

1  写一个母模板 base.html
2 要更改的地方在block标签编辑
		{% block base %}
			母模板的盒子里也可以写东西
		{% endblock %}
3 在其他文件中调用母模板{%extends 'base.html' %}
4 建盒子编辑自己的内容;
        {% block base %}
        自己的东西
        {% endblock my_head%}
5 用母版里的内容({{block.super}} 放在那,原来母版里的东西,就会渲染在哪)
		{% block base %}
		{{block.super}}
		自己的东西						
		{% endblock my_head%}
注:(1)如过不继承母模板盒子,它会用原来的内容;如果继承了,没写自己的东西,它会空白;写自己的内容就是什么内容,
通过{{block.super}},可渲染出原来母模板的内容
(2)盒子再继承时,跟顺序无关

6. inclusion_tag

  • 作用:返回html代码片段
  • 步骤
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 @register.inclusion_tag('test.html')
	def my_inclusion(n):
		data=[]
		for i in range(n):
			data.append('第%s行'%i)
		return {'data':data}
7 写test.html页面
		<ul>
		  {% for choice in data %}
			<li>{{ choice }}</li>
		  {% endfor %}
        </ul>
	
8 视图函数中要渲染的页面
{% load my_test %}
 {% my_inclusion 10 %}   #它会返回html的页面

相关文章: