模板"/>
django之模板
一、模板概念
1.django通过模板动态的生成HTML
2.模板加载的位置(在setting.py中设置)
DIRS决定模板路径的全局变量,APP_DIRS决定是否在应用目录中寻找模板
3.模板引擎:Django框架常用Django模板引擎
二、模板变量
1.语法:{{模板变量名}} 显示模板变量
2.点语法访问复杂对象:
字典,对象(无参方法,除了self参数),列表(Django模板引擎不支持负数索引)
3.locals()函数返回一个字典,字典中包含的是当前局部变量的内容
from django.shortcuts import renderdef go_login(request):return render(request,'login.html')
————————————————————————————————————————————————————————————————————————————————————————————————————————————
def login(request):
postdata = request.POST
print('接收到的请求数据类型:',type(postdata))
logname = postdata.get('logname')
logpaw = postdata.get('logpwd')
if logname == 'tom' and logpaw == '123456':
return render(request,'welcome.html',{'username':logname})
else:
return render(request,'login.html',{'msg':'用户名或密码输入错误'})
—————————————————————————————————————————————————————————————————————————————————————————————————————————
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h3 style="color:red">{{ msg }}</h3>
<form action="/myapp/login/" method="post">
用户名:<input type="text" name="logname"><br>
密 码:<input type="password" name="logpwd"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------
def pass_dict(request):
product_dict = {
'name': '雕牌洗衣粉',
'price': 12.4,
}
return render(request,'var/show_info.html',{'product':product_dict})
def pass_person(request):
per = Person('二傻',38)
return render(request,'var/show_info.html',{'person':per})
def pass_list(request):
fruits = ['苹果','香蕉','橘子']
return render(request,'var/show_info.html',{'fruits':fruits})
def pass_all(request):
product_dict = {
'name': '旺仔牛奶',
'price': 18,
}
per = Person('二傻', 38)
fruits = ['苹果', '香蕉', '橘子']
return render(request,'var/show_info.html',locals())
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示点语法访问模板变量</title>
</head>
<body>
<h3>商品名称(接收字典变量):{{ product.name }}</h3>
<h3>商品价格(接收字典变量):{{ product.price }}</h3>
<h3>人的姓名(接收类变量):{{ person.name }}</h3>
<h3>人的年龄:{{ person.age }}</h3>
<h3>人的动作:{{ person.say }}</h3>
<h3>水果列表:{{ fruits.1 }}</h3>
<h3>水果列表:{{ fruits.0 }}</h3>
<h3>商品名称(接收字典变量):{{ product_dict.name }}</h3>
<h3>商品价格(接收字典变量):{{ product_dict.price }}</h3>
<h3>人的姓名(接收类变量):{{ per.name }}</h3>
<h3>人的年龄:{{ per.age }}</h3>
<h3>人的动作:{{ per.say }}</h3>
<h3>水果列表:{{ fruits.1 }}</h3>
<h3>水果列表:{{ fruits.0 }}</h3>
</body>
</html>
三、模板标签
1.if 标签
1.1简单if标签
{% if 布尔值 %} 布尔值为True时,显示的内容
{% else %} 布尔值为False时,显示的内容
{% endif %} 注意:可以在if后添加and、or、not,逻辑判断符号。判断是否相等,使用"=="符号。
2.多分支if标签:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>if标签</title> </head> <body>{% if score >= 90 %}<h3>优秀</h3>{% elif score >= 80 %}<h3>良好</h3>{% elif score >= 70 %}<h3>一般</h3>{% elif score >= 60 %}<h3>及格</h3>{% else %}<h3>留级</h3>{% endif %} </body> </html>
--------------------------------------------------------------------------------------------------------
def show_info(request,score):
try:
score = float(score)
except:
score = 0
return render(request,'tag/if_demo.html',locals())
3.for标签
3.1.{% for 循环变量 in 循环序列 %}
{{ 循环变量 }}
{% empty %}
如果循环序列为空,执行此处
{% endfor %}
注意:使用for标签循环时,有一个forloop模板变量,用来记录当前循环进度的。
3.2 forloop的常用属性:counter、first、last。
如果要进行反向循环,则在for标签的循环序列后加上reversed。
用法举例:
forloop.last 是一个布尔值;在最后一次执行循环时被置为True。一个常见的用法是在一系列的链接之间
放置管道符(|)
{% for link in links %}{{ link }}
{% if not forloop.last %} | {% endif %}
{% endfor %}
另一个常见的用途是为列表的每个单词的加上逗号
{% for p in places %}
{{ p }}
{% if not forloop.last %}, {% endif %}
{% endfor %}
def show_list(request):countries = ['中国','美国','俄罗斯','法国',]#countries = []navs = ['首页','推荐','西安','抖音','娱乐',]return render(request, 'tag/for_demo.html', locals())
---------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for标签</title>
</head>
<body>
<ul>
{% for country in countries reversed %}
<li>{{ country }}</li>
{% endfor %}
<hr>
{% for nav in navs %}
{{ nav }}
{% if not forloop.last %}
|
{% endif %}
{% endfor %}
</ul>
</body>
</html>
3.include标签
include标签常用来包含那些固定不变的模板
{% include '包含的模板地址' %}
def go_include(request):return render(request,'tag/inlcude_demo.html')
-----------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎访问我的网站 <br>
这是网站的主题内容 <br>
…… <br>
<br>
{% include 'tag/footer.html' %}
</body>
</html>
----------------------------------------------------------------------------------------------------------------------
footer.html文件
友情链接:
<a href="htts//www.baidu">百度</a>
<a href="htts//www.360">360</a>
<a href="htts//www.sohu">搜狐</a>
<a href="htts//www.sougou">搜狗</a>
4.模板继承标签
父模板(基模板)提前定义若干个block块标签,子模板可以继承、重写、添加父模板block块中的内容。
子模板通过{% extends '父模板位置' %}继承父模板。
父模板使用
{% block 块名称 %}
{% endblock %}
进行“挖坑”,子模板“填坑”。
子模板如果想要在父模板的某个块中添加内容,则先要使用{{ block.super }}获取父模板中该块的内容。
def go_child(request):return render(request,'tag/child.html',{'info':'西安将会是国际化大农村'})
-------------------------------------------------------------------------------------------
parent.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h3>西安市委官方网站</h3>
{% block content %}
{% endblock %}
{% block slogon %}
<h3>为人民服务</h3>
{% endblock %}
<hr>
以下是视图函数view传递过来的数据:
{{ info }}
</body>
</html>
_________________________________________________________________________________________________________
child.html
{% extends 'tag/parent.html' %}
{% block title %}
西安欢迎你
{% endblock %}
{% block content %}
市委书记:王永康 <br>
市委副书记:暂无 <br>
其他人员。。。 <br>
{% endblock %}
{% block slogon %}
{{ block.super }}
<h3>加油,加油</h3>
{{ block.super }}
{% endblock %}
四、模板过滤器
1.作用:在变量显示之前修改他的值
2.使用方法:模板变量后面添加管道符|,管道符后是过滤器名称
3.常用模板过滤器:
3.1. length 获取模板变量对应值的长度
3.2.first 获取第一个元素
3.3.upper 变为大写
3.4.lower 变为小写
3.5.truncatewords:"字符数" 截取指定数量的字符,该过滤器需要参数
3.6.date 显示日期,该过滤器需要参数,eg: date:"Y-m-d H:i:s"
3.7.addslashes 在单引号、双引号、反斜线前添加斜线
3.8.add:"添加的数字" 在模板变量上添加指定的数据
def show_filter(request):s = 'hello django,hello world ,hello python'num = 100say = 'He said:"you are stupid!"'t = datetime.now()info = '<h3>这是传递的infoxinxi</h3>'return render(request,'filter/fileter_demo.html',locals())
-------------------------------------------------------------------------------------------------------------
filter_demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>演示模板过滤器</title>
</head>
<body>
<h3>传递的字符串的长度:{{ s|length }}</h3>
<h3>传递的字符串首字母大写:{{ s|capfirst }}</h3>
<h3>连续调用过滤器使首字母大写{{ s| first|upper}}</h3>
<h3>选取前1个单词:{{ s| truncatewords:'5'}}</h3>
<h3>选取前1个单词:{{ s| truncatechars:'5'}}</h3>
<h3>当前时间:{{ t|date:'Y-m-d H:i:s' }}</h3>
<h3>addslashes过滤器{{ say|addslashes }}</h3>
<h3>给变量添加5:{{ num|add:5 }}</h3>
<h3>未加safe过滤器{{ info }}</h3>
<h3>添加加safe过滤器{{ info |safe}}</h3>
</body>
</html>
4.自定义过滤器
自定义过滤器的步骤:
4.1.在app目录下建立templatetags包(包含__init__文件),并在此包下建立自己的过滤器模块(例如:myfilter.py)
4.2.在自定义的过滤器模块中编写:
from django import template
register = template.Library()
并使用装饰器@register.filter装饰一个函数,这个函数就是过滤器的具体调用,第一个参数是传递过来的模板变量;如果需要对该过滤器设置参数,还需要传递第二个参数
4.3.在模板中加载过滤器模块 {% load myfilter %}
自定义的过滤器
from django import templateregister = template.Library() #该对象可以用来注册模板过滤器 @register.filter(name='Chinese_upper') def number_to_upper(value,s):try:return ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'][value] + '\t' + sexcept:return '参数有误'
----------------------------------------------------------------------------------------------------
<!DOCTYPE html>
{% load myfilter %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义过滤器</title>
</head>
<body>
{{ num|Chinese_upper:"李逼 "}}
</body>
</html>
----------------------------------------------------------------------------------------------------------------------
def show_custom_filter(request,num):
return render(request,'filter/custom_filter.html',locals())
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
from django import template
register = template.Library() #该对象可以用来注册模板过滤器
@register.filter(name='dictfilter')
def get_dict_value(value,key):
return value[key]
---------------------------------------------------------------------------------------------------------------
def show_values(request):
mydict={
'sport':'football',
'fruit':'apple',
}
return render(request,'values.html',locals())
---------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
{% load myfilter1 %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义模板过滤器</title>
</head>
<body>
key为sport的值为{{ mydict|dictfilter:'sport' }}<br>
key为fruit的值为{{ mydict|dictfilter:'fruit' }}<br>
</body>
</html>
转载于:.html
更多推荐
django之模板
发布评论