templates
Django自带的是DTL(Django Templates language)
DTL模版是一种带有特殊语法的HTML文件。
渲染模版方式有两种
方式1:
render_to_string()找到模版,然后将模版编译后渲染成Python的字符串格式。
最后再通过HttpResource类包装成一个HttpResponse对象返回
from django.template.loader import render_to_string
from django.http import HttpResponse
def return_page(request):
html = render_to_string("login.html")
return HttpResponse(html)
方式2:
render()直接将模板渲染称字符串和包装成HttpResponse对象一步到位完成。
from django.shortcuts import render
from django.http import HttpResponse
def return_page(request):
return render(request, "login.html")
render_to_response将被render取代,功能一致
模版查找路径
在setting.py中查看
# 该配置包含了模板引擎的配置、模板查找路径的配置、模板上下文的配置等。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] #自定义templates文件夹的绝对路径
,
'APP_DIRS': True, # 注意 开启App内查找templates文件夹下的html
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
模板查找路径
DIRS:一个列表,存放所有的模板路径。
APP_DIRS :默认为True,为True时,会在INSTALLED_APP已安装的APP下的
templates文件夹(注意文件夹名一定是templates)中查找模板
如果为False,就只在DIRS中查找
模板查找顺序
会先在DIRS这个列表中一次找到路径下有无该模板,如果有,则返回
如果没有,则检查当前视图函数所处的app是否已经安装,如果已经安装,
则就先该app下的templates文件夹中查找模板
如果没有,则检查其他已经安装的app下的templates文件夹
如果没有,则抛出TemplateDoesNotExist的异常
优先级DIRS>本app的templates文件夹>其他app的templates文件夹
django 模板的语法
基本语法1:
返回数据为字典:
return render(request, ‘xxx.html’, {‘key1’: value1, ‘key2’: {‘k’: v}})
模板:
{{ key1 }}
{{ key2.k}}
允许多层嵌套 获取字典中的下一层用 .
作业: 显示时间 (已经做)
基本语法2:
for 循环取值
传递的值为:
{data : {1:1, 2:2 ,3:3 , 4:4}} 注意列表一样
模板:
{% for i in data %} 默认正序
<h1>{{ i }}<h1>
{% endfor%}
{% for ii in data reversed %} 倒叙
<h2>{{ ii }}<h2>
{% endfor%}
注意==== 如果要获取字典的key value
{% for key, value in data.items %}
<h2>{{key}}---{{value}} <h2>
{% endfor%}
注意==== 如果给出的组是空或者没有找到时可以使用 {% empty %}
{% for person in data_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no this person</p>
{% endfor %}
注意for循环语句中的内部模板变量:
列如:
forloop.counter 表示循环的次数 1开始
forloop.counter0 同上 0开始
forloop.revcounter 表示循环后剩余元素的数量 1开始
forloop.revcounter0 同上 0开始
forloop.first 第一个元素为true 是个布尔值(常和if一起使用)
forloop.last 同上 最后一个元素
forloop,parentloop 引用父级元素 常和for一起使用
基本语法3:
if标签
if标签可判断一个变量 如果符合该条件 则执行对应的内容 否则不执行
{% if num > 2 %}
{{num}}
{% elif num == 2 %}
{{等于2}}
{% else %}
{{小于2}}
{% endif %}
基本语法4:
form表单提交数据
csrf_token:跨站点请求伪造保护
提交数据的时候会做安全机制,
就是用settings配置里面的csrf做的安全机制,
注释该安全机制 或 在form表单下面添加{% csrf_token %}
参数的获取:
def login(request):
user_name = request.POST.get('UserName')
pass_word = request.POST.get('PassWord')
....
基本语法5:
1.多行注释
{% comment %}
内容
{% endcomment %}
基本语法6:
模板语法过滤器:{{ obj|过滤器名称:param }},过滤器使用管道字符
1.default:
{{ variable| default: "nothing"}}
如果变量是false或者为空,使用默认值。否则,使用变量的值
列如: <p>{{ li|default:"暂无数据。" }}</p>
2.length:
返回值的长度,它对字符串和列表都起作用
{{ value | length }}
如果value是["a", "b", "c", "d"],那么输出是4
3.filesizeformat:
将值格式化为"人类可读"的文件尺寸(例如:13KB,4.1M,102bytes等等)
{{ value | filesizeformat }}
如果value是123456789,输出将会是117.7MB
4.date:
格式化日期时间格式
{{ value | date:"Y-m-d" }}
如果value=datetime.datetime.now(),返回时间的年-月-日格式
5.slice:
切片
{{ value | slice:"2:-1" }}
如果value="hello world",返回'llo worl'
6.
truncatechars:截断
如果字符串字符多于指定的字符数量,那么会被截断。
截断的字符串将以可翻译的省略号序列(...)
结尾,参数:要截断的字符数。
列如:
<p1>截断字符: {{ content | truncatechars:20 }}</p1>
<p2>截断单词: {{ content | truncatewords:4 }}</p2>
如果content是"i am is jack, where are you come from?"
输出结果:
p1 截断字符: i am is jack, whe...;
p2 截断单词i am is jack, where...
7.safe
django的模板中会对HTML标签和JS语法标签进行自动转义,
告诉django这段代码是安全的不必转义,如下:
传递的参数: value=“点击”"
模板 : {{ value | safe }}
<p>{{ label }}</p> # 为了安全,系统会把标签变成字符串
<p>{{ label | safe }}</p> # 加上safe
或者
关闭自动转义
{% autoescape off%}
code
{% endautoescape %}
打开自动转义转义
{% autoescape on%}
code
{% endautoescape %
8. add lower upper
add {{ value|add: "2" }}
{{ value|add:-2 }} 没有减法过滤器,但是加法里可以加负数
lower
{{ name|lower }} 小写
upper
{{ my_list|first|upper }} 首字母大写
基本语法7:
页面的跳转:
urlpatterns = [ # 路由配置
path('', views.index),
path('login/', views.login, name='login'), # 这里设置name,为了在模板文件中,
写name,就能找到这个路由
path('book/', views.book, name='book'),
path('book/detail/<book_id>/<catgray>/', views.book_detail, name='detail'),
]
ur
-
# 前端页面代码
- 首页
<li><a href="{% url 'login' %} ">登录</a></li>
点读书就会调到,读书页,路径
<li><a href="{% url 'book' %}">读书</a></li>
在这里,直接写name,就能找到urls文件中对应的路由
<li><a href="{% url 'book' %}">读书</a></li>
<li><a href="{% url 'detail' book_id='1' catgray=2 %}">你们的作业按组上交</a></li> 带参数
</ul>
难点:
模板的继承
模板继承
关键字block:挖坑
{% block XXX%}
code
{% endblock %}
extends 继承,写在开头位置
{% extends '父模板路径' %}
include: 加载模板进行渲染
格式{% include '模板文件' %}
URL传递参数:
使用url给视图函数传参数
在url配置中将正则部分小括号括起来。比如:
url(r’^time/plus/(\d{6})/$’, views.hours_ahead)
def login(request, PassWord):
PassWord = PassWord # 获取参数
…
如果有多个参数则用/分割,比如:
url(r'^time/plus/(\d{1,2})/(\d{1,2})/$', views.login),
def login(request, arg1=None, arg2=None):
num1 = arg1
num2 = arg2
....
给参数命名,使用正则的分组,比如:
url(r'^time/plus/(?P<time1>\d{1,2})/(?P<time2>\d{1,2})/$', views.hours_ahead)
使用分组之后,视图函数的参数必须用分组的名称,但是位置可以不固定。
def login(request, time1, time1):
time1, time2 = time1, time2
.....
给url取别名,那么在使用此url的地方可以使用别名。比如:
url(r'^buy/$', views.buy, name='buy'),
url(r'^login/$', views.login, name='login'),
在视图函数中,反向解析url:
def buy(request):
return HttpResponseRedirect(reverse('login'))
def login(request):
return HttpResponse("please login")
在template中,使用别名:{% url 'hours_ahead' %}
使用命名空间,在include时,可以指定命名空间,更加细化的划分url。比如:
url(r'^App/', include('App.urls', namespace='App')),
指定命令空间后,使用反向解析时需要加上命名空间,比如:
return HttpResponseRedirect(reverse('App:login'))
{% url 'App:login' %}
作业: 搞定url前端参数的传递