天津网站建设定做,网页设计入门 电子书下载,网络搭建结构图,有哪些建设网站公司1.常用语法
Django模板中只需要记两种特殊符号#xff1a;
{{ }}和 {% %}
{{ }}表示变量#xff0c;在模板渲染的时候替换成值#xff0c;{% %}表示逻辑相关的操作。
2.变量
{{ 变量名 }}
变量名由字母数字和下划线组成。
点#xff08;.#xff09;在模板语言中有…1.常用语法
Django模板中只需要记两种特殊符号
{{ }}和 {% %}
{{ }}表示变量在模板渲染的时候替换成值{% %}表示逻辑相关的操作。
2.变量
{{ 变量名 }}
变量名由字母数字和下划线组成。
点.在模板语言中有特殊的含义用来获取对象的相应属性值。
几个例子
view中代码
def template_test(request):l [11, 22, 33]d {name: alex}class Person(object):def __init__(self, name, age):self.name nameself.age agedef dream(self):return {} is dream....format(self.name)Alex Person(nameAlex, age34)Egon Person(nameEgon, age9000)Eva_J Person(nameEva_J, age18)person_list [Alex, Egon, Eva_J]return render(request, template_test.html, {l: l, d: d, person_list: person_list})模板中支持的写法
{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}注当模板系统遇到一个.时会按照如下的顺序去查询
在字典中查询属性或者方法数字索引
3.过滤器Filter
翻译为过滤器用来修改变量的显示结果。
语法 {{ value|filter_name:参数 }}
:左右没有空格
default
{{ value|default:nothing}}如果value值没传的话就显示nothing
注TEMPLATES的OPTIONS可以增加一个选项string_if_invalid找不到可以替代default的的作用。
filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 例如 13 KB, 4.1 MB, 102 bytes, 等等。例如
{{ value|filesizeformat }}如果 value 是 123456789输出将会是 117.7 MB。
add
给变量加参数
{{ value|add:2 }}value是数字4则输出结果为6。
{{ first|add:second }}如果first是 [1,.2,3] second是 [4,5,6] 那输出结果是 [1,2,3,4,5,6] 。
lower
小写
{{ value|lower }}upper
大写
{{ value|upper}}title
标题
{{ value|title }}ljust
左对齐
{{ value|ljust:10 }}rjust
右对齐
{{ value|rjust:10 }}center
居中
{{ value|center:15 }}length
{{ value|length }}
返回value的长度如 value[a, b, c, d]的话就显示4.
slice
切片
{{value|slice:2:-1}}first
取第一个元素
{{ value|first }}last
取最后一个元素
{{ value|last }}join
使用字符串拼接列表。同python的str.join(list)。
{{ value|join: // }}truncatechars
如果字符串字符多于指定的字符数量那么会被截断。截断的字符串将以可翻译的省略号序列“...”结尾。
参数截断的字符数
{{ value|truncatechars:9}}
date
日期格式化
{{ value|date:Y-m-d H:i:s}}
可格式化输出的字符点击查看。
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义原因显而易见这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义比如我们做一个内容管理系统后台添加的文章中是经过修饰的这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
比如
value 点我
{{ value|safe}}
自定义filter
自定义过滤器只是带有一个或两个参数的Python函数:
变量输入的值 - -不一定是一个字符串参数的值 - 这可以有一个默认值或完全省略
例如在过滤器{{var | foo“bar”}}中过滤器foo将传递变量var和参数“bar”。
自定义filter代码文件摆放位置
app01/__init__.pymodels.pytemplatetags/ # 在app01下面新建一个package package__init__.pyapp01_filters.py # 建一个存放自定义filter的py文件views.py
编写自定义filter
from django import template
register template.Library()register.filter
def fill(value, arg):return value.replace( , arg)register.filter(nameaddSB)
def add_sb(value):return {} SB.format(value)
使用自定义filter
{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}{# 使用我们自定义的filter #}
{{ somevariable|fill:__ }}
{{ d.name|addSB }}
4.标签Tags
for
ul
{% for user in user_list %}li{{ user.name }}/li
{% endfor %}
/ul
for循环可用的一些参数
VariableDescriptionforloop.counter当前循环的索引值从1开始forloop.counter0当前循环的索引值从0开始forloop.revcounter当前循环的倒序索引值到1结束forloop.revcounter0当前循环的倒序索引值到0结束forloop.first当前循环是不是第一次循环布尔值forloop.last当前循环是不是最后一次循环布尔值forloop.parentloop本层循环的外层循环
for ... empty
ul
{% for user in user_list %}li{{ user.name }}/li
{% empty %}li空空如也/li
{% endfor %}
/ul
if,elif和else
{% if user_list %}用户人数{{ user_list|length }}
{% elif black_list %}黑名单数{{ black_list|length }}
{% else %}没有用户
{% endif %}
当然也可以只有if和else
{% if user_list|length 5 %}七座豪华SUV
{% else %}黄包车
{% endif %}
if语句支持 and 、or、、、、!、、、in、not in、is、is not判断。
with
定义一个中间变量
{% with totalbusiness.employees.count %}{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token
这个标签用于跨站请求伪造保护。
在页面的form表单里面写上{% csrf_token %}
注释
{# ... #}
注意事项
Django的模板语言不支持连续判断即不支持以下写法
{% if a b c %}
...
{% endif %}
Django的模板语言中属性的优先级大于方法
def xx(request):d {a: 1, b: 2, c: 3, items: 100}return render(request, xx.html, {data: d})
如上我们在使用render方法渲染一个页面的时候传的字典d有一个key是items并且还有默认的 d.items() 方法此时在模板语言中:
{{ data.items }}
默认会取d的items key的值。
5.模板继承 Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版它包含您站点中的全部元素并且可以定义能够被子模版覆盖的 blocks 。 通过从下面这个例子开始可以容易的理解模版继承
!DOCTYPE html
html langen
headlink relstylesheet hrefstyle.css /title{% block title %}My amazing site{%/span endblock %}/title
/headbodydiv idsidebar{% block sidebar %}ullia href/Home/a/lilia href/blog/Blog/a/li/ul{% endblock %}/divdiv idcontent{% block content %}{% endblock %}/div
/body
/html 这个模版我们把它叫作 base.html 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。 在这个例子中 block 标签定义了三个可以被子模版内容填充的block。 block 告诉模版引擎 子模版可能会覆盖掉模版中的这些位置。 子模版可能看起来是这样的
{% extends base.html %}{% block title %}My amazing blog{% endblock %}{% block content %}
{% for entry in blog_entries %}h2{{ entry.title }}/h2p{{ entry.body }}/p
{% endfor %}
{% endblock %} extends 标签是这里的关键。它告诉模版引擎这个模版“继承”了另一个模版。当模版系统处理这个模版时首先它将定位父模版——在此例中就是“base.html”。 那时模版引擎将注意到 base.html 中的三个 block 标签并用子模版中的内容来替换这些block。根据 blog_entries 的值输出可能看起来是这样的
!DOCTYPE html
html langen
headlink relstylesheet hrefstyle.css /titleMy amazing blog/title
/headbodydiv idsidebarullia href/Home/a/lilia href/blog/Blog/a/li/ul/divdiv idcontenth2Entry one/h2pThis is my first entry./ph2Entry two/h2pThis is my second entry./p/div
/body
/html 请注意子模版并没有定义 sidebar block所以系统使用了父模版中的值。父模版的 {% block %} 标签中的内容总是被用作备选内容fallback。 这种方式使代码得到最大程度的复用并且使得添加内容到共享的内容区域更加简单例如部分范围内的导航。 这里是使用继承的一些提示 如果你在模版中使用 {% extends %} 标签它必须是模版中的第一个标签。其他的任何情况下模版继承都将无法工作模板渲染的时候django都不知道你在干啥。 在base模版中设置越多的 {% block %} 标签越好。请记住子模版不必定义全部父模版中的blocks所以你可以在大多数blocks中填充合理的默认内容然后只定义你需要的那一个。多一点钩子总比少一点好。 如果你发现你自己在大量的模版中复制内容那可能意味着你应该把内容移动到父模版中的一个 {% block %} 中。 将子页面的内容和继承的母版中block里面的内容同时保留,可以使用{{block.super}} 为了更好的可读性你也可以给你的 {% endblock %} 标签一个 名字 。例如 {% block content %}
...
{% endblock content %} 不能在一个模版中定义多个相同名字的 block 标签。
6.组件 可以将常用的页面内容如导航条页尾信息等组件保存在单独的文件中然后在需要使用的地方文件的任意位置按如下语法导入即可。
{% include navbar.html %}
例如有个如下的导航栏,nav.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/titlestyle.c1{background-color: red;height: 40px;}/style
/head
bodydiv classc1diva hrefxx/aa hrefdd/a/div
/div/body
/html
嵌入导航栏的页面test.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
{% include nav.html %}
h1xxxxxxxxxx/h1
/body
/html
组件和插件的简单区别:
组件是提供某一完整功能的模块如编辑器组件QQ空间提供的关注组件 等。而插件更倾向封闭某一功能方法的函数。这两者的区别在 Javascript 里区别很小组件这个名词用得不多一般统称插件。
7.自定义标签和过滤器 1、在settings中的INSTALLED_APPS配置当前app不然django无法找到自定义的simple_tag. 2、在app中创建templatetags模块(模块名只能是templatetags) 3、创建任意 .py 文件如my_tags.py
from django import template
from django.utils.safestring import mark_saferegister template.Library() #register的名字是固定的,不可改变register.filter
def filter_multi(v1,v2):return v1 * v2register.simple_tag #和自定义filter类似只不过接收更灵活的参数没有个数限制。
def simple_tag_multi(v1,v2):return v1 * v2register.simple_tag
def my_input(id,arg):result input typetext id%s class%s / %(id,arg,)return mark_safe(result)
4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py
{% load my_tags %}
5、使用simple_tag和filter如何调用
-------------------------------.html{% load xxx %} # num12
{{ num|filter_multi:2 }} #24{{ num|filter_multi:[22,333,4444] }}{% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}
注意filter可以用在if、for等语句后simple_tag不可以
{% if num|filter_multi:30 100 %}{{ num|filter_multi:30 }}
{% endif %}
inclusion_tag
多用于返回html代码片段
示例 templatetags/my_inclusion.py
from django import templateregister template.Library()register.inclusion_tag(result.html) #将result.html里面的内容用下面函数的返回值渲染然后作为一个组件一样加载到使用这个函数的html文件里面
def show_results(n): #参数可以传多个进来n 1 if n 1 else int(n)data [第{}项.format(i) for i in range(1, n1)]return {data: data}#这里可以穿多个值和render的感觉是一样的{data1:data1,data2:data2....}
templates/snippets/result.html
ul{% for choice in data %}li{{ choice }}/li{% endfor %}
/ul
templates/index.html
!DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivx-ua-compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1titleinclusion_tag test/title
/head
body{% load inclusion_tag_test %}{% show_results 10 %}
/body
/html
7.静态文件相关 js、css、img等都叫做静态文件那么关于django中静态文件的配置我们就需要在settings配置文件里面写上这写内容
# STATIC_URL /xxx/ #别名,随便写名字但是如果你改名字别忘了前面页面里面如果你是通过/xxx/bootstrap.css的时候如果这里的别名你改成了/static/的话你前端页面的路径要改成/static/bootstrap.css。所以我们都是用下面的load static的方式来使用静态文件路径
STATIC_URL /static/ #别名STATICFILES_DIRS [os.path.join(BASE_DIR,statics), #注意别忘了写逗号,第二个参数就是项目中你存放静态文件的文件夹名称
]#在引入时就可以:link relstylesheet href/static/css/index.css
目录别名也是一种安全机制浏览器上通过调试台你能够看到的是别名的名字这样别人就不能知道你静态文件夹的名字了不然别人就能通过这个文件夹路径进行攻击。
前端页面引入静态文件的写法因为别名也可能会修改所以使用路径的时候通过load static来找到别名通过别名映射路径的方式来获取静态文件. {% static %}
{% load static %}
img src{% static images/hi.jpg %} altHi! / 引用JS文件时使用
{% load static %}
script src{% static mytest.js %}/script 某个文件多处被用到可以存为一个变量
{% load static %}
{% static images/hi.jpg as myphoto %}
img src{{ myphoto }}/img {% get_static_prefix %}
{% load static %}
img src{% get_static_prefix %}images/hi.jpg altHi! / 或者
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}img src{{ STATIC_PREFIX }}images/hi.jpg altHi! /
img src{{ STATIC_PREFIX }}images/hi2.jpg altHello! /
注意一个html文件中写相对路径时需要注意的一个问题
例子
form action/login//form
img src/static/1.jpg alt
等标签需要写路径的地方如果写的是相对路径那么前置的/这个斜杠必须写上不然这个请求会拼接当前网页的路径来发送请求就不能匹配我们的后端路径了