django_templatess使用

本文介绍了Django的模板语言DTL,包括模板查找路径、两种渲染方式以及一系列基本语法,如字典嵌套访问、for循环变量、if条件判断、表单提交、多行注释、过滤器和页面跳转与URL参数传递。
摘要由CSDN通过智能技术生成

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 %}

# 也可以使用get {% 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前端参数的传递

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值