T部分指的就是Django项目下的templates文件夹
是Django自带的模板系统 (Template System)
它的作用是将python代码和HTML文件解耦合,如此也便于维护
templates文件夹文件间存放HTML文件
Django的setting.py已经默认将路径添加,所以在全局都可以调用的到
其中HTML文件,也就是模版的组成是:
HTML代码+逻辑控制代码
这里主要讲逻辑控制代码
一, 大变量(使用双大括号来引用变量):
语法格式: {{var_name}}
这里配合python代码中render类方法使用
插一个
对 Django render方法底层实现的总结
首先看怎么用:
return render (request,html文件的字符串形式,context对象)
python manange.py shell (进入该django项目的环境)
from django.template import Context, Template
t = Template(‘My name is {{ name }}.’)
c = Context({‘name’: ‘Stephane’})
t.render©
‘My name is Stephane.’
上面是具体实现过程:
可以看出来,Template和Context是两个类,由他们实例化出两个对象,Template类对象调用render方法,传入Context实例化对象做参数
所以render有几个用处:
1.render会把第二个参数(html文件的字符串形式)实例化为Template对象,把第三个参数实例化为Context对象,然后Template类对象调用render方法,传入Context实例化对象做参数,得到一个结果
2render把处理好的结果会交给Httpresponse返回给客户端,所以要有一个request参数
作者:月守护
来源:优快云
原文:https://blog.youkuaiyun.com/csdniter/article/details/93391220
版权声明:本文为博主原创文章,转载请附上博文链接!
二, 深度变量的查找(万能的句点号)
<h1>hello {{ l.1 }}</h1>
{#深度查询,用万能的句点号. 列表,元组,字典,类可以#}
三,变量的过滤器(filter)的使用
语法格式: {{obj|filter:param}}
Django 自带的一些过滤器
1 add
: 给变量加上相应的值
2 addslashes
: 给变量中的引号前加上斜线
3 capfirst : 首字母大写
4 cut : 从字符串中移除指定的字符
5 date : 格式化日期字符串
6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值
7 default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值
此外,还可以自定制fliter过滤器方法,后面和自定制标签一起讲到
四,标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)
语法格式:{% tags %}
1.------{% if %}
的使用
{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容
注:里面可以嵌套的条件判断和python语法一样,多了一个对应endif
后面的tag都参照Python语法,不再赘述
2.------{% for %}
的使用
{% for %}标签允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容
3.------{%csrf_token%}
:csrf_token标签
用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效
其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。
注:这个问题目前只在form表单post提交方式里出现,
另一种解决方法是注释掉setting.py文件的相关功能部分
’django.middleware.csrf.CsrfViewMiddleware’
4.------{% url %}
: 引用路由配置的地址
form表单中action属性相关,同源情况下用别名的一种方式
eg:<form action="{% url “注册” %}" method=“post”>
5.------{% with %}
:用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
6.------{% verbatim %}
: 禁止render
{% verbatim %}
{{ hello }}
{% endverbatim %}
五, 自定义filter和simple_tag
------a、在app中创建templatetags模块(必须的)
------b、创建任意 .py 文件,如:my_tags.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
@register.filter
def filter_multi(v1,v2):
return v1 * v2
@register.simple_tag
def simple_tag_multi(v1,v2):
return v1 * v2
@register.simple_tag
def my_input(id,arg):
result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
return mark_safe(result)
------c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}
------d、使用simple_tag和filter(如何调用)
-------------------------------.html
{% load xxx %} #首行
# num=12
{{ num|filter_multi:2 }} #24
{{ num|filter_multi:"[22,333,4444]" }}
{% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}
------e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
注意区别:1.自定制filiter只能传入第二个参数,默认第一个是大变量
自定制tag参数不限
两者都可以传入大变量,注意格式,不需再加{{ }}
2.filter可以用在if等语句后,simple_tag不可以
六,extend模板继承
目的是为了代码复用
首先在base.html要被修改的部分加上钩子
{% block 钩子名 %}
要修改部分
{% endblock %}
理论上钩子越多越好
其他html文件(子模板)要用base.html(父模板)代码
要首先继承
{% extends "base.html" %}
然后在修改钩子部分
{% block 钩子名 %}
修改后部分
{% endblock %}
这些都是用钩子名来对应的,所以不允许在同一个模板中定义多个同名的 {% block %}
还可以把父类钩子里的内容拿过来加以改进:
{% block 钩子名 %}
{{block.super}}
修改后部分
{% endblock %}
再加一个把html,css或者是js文件添加到html文件
html:
{% include “test.html” %}
引入css方式:
<link rel="stylesheet" href=" css文件路径">
注:在html的head部分
引入JS方式:
<script src="js文件路径"></script>
在body部分
文件路劲要保证Django可以找得到,一般是放在"static’文件夹中
所以这里要在setting.py中添加路径
STATICFILES_DIRS=(
os.path.join(BASEDIRS,"static")
)
并且Django会自动给一个别名:
STATIC_URL = '/static/'
————————————分隔线—————————————————
补充一个Html格式的字符串的两种渲染方式:
eg:
#后台
def Text(request)
text="<input type="text">"
return render(request,"xxx.html",{"text":text})
{{ text }}
浏览器显示效果:"<input type="text" />"
要想正常渲染,有两种方式:
一,后台处理:
from django.utils.safestring import mark_safe
def Text(request)
text="<input type="text">"
text=mark_safe(text)
return render(request,"xxx.html",{"text":text})
二,前端处理
{{ text | safe }}
两种方式处理之后都都正常显示输入框
强行不渲染参见Tag使用第六条