模板层
模板语法之变量
在 Django 模板中遍历复杂数据结构的关键是句点字符,
语法: {{ var_name }}
views.py
from django.shortcuts import render, HttpResponse, redirect
def temp_test(request):
import datetime
name_666 = "马具强"
list1 = ['张国成', "张俊林", "陈桂涛"]
dict1 = {'name':"张国城", "age":8, "sex":"female"}
date = datetime.datetime.now()
print(date.year)
class Person(object):
def __init__(self, name):
self.name = name
def eat(self):
return "%s - chihuo" % self.name
person_yuan = Person("yuan") # 自定义类对象
person_egon = Person("egon")
person_alex = Person("alex")
person_list = [person_yuan, person_egon, person_alex]
return render(request, "temp_test.html", {"name": name_666, # 让你区分前后端变量的区别
'list1': list1,
"dict1":None,
"date": date,
"person_list": person_list})
templates/temp_test.html
<h3>模板层</h3>
{#普通的变量#}
<h4>{{ name }}</h4>
<hr>
{#list#}
<p>{{ list1 }}</p>
{#根据索引取值 . 的形式#}
<p>{{ list1.0 }}</p>
<hr>
{#字典#}
<p>{{ dict1 }}</p>
{#字典取值,直接.key即可#}
<p>{{ dict1.name }}</p>
<p>{{ dict1.sex }}</p>
{#对象#}
<hr>
<p>{{ date.year }}</p>
<hr>
{#对象的属性和方法,直接点即可#}
<p>{{ person_list.0.name.upper }}</p>
<p>{{ person_list.0.eat }}</p>
模板语法之过滤器
语法:
{{obj|filter__name:param}}
过滤器最多只能有两个参数
views.py
def guo(request):
import datetime
name = "zhagnguocheng"
num = 1024
now = datetime.datetime.now()
temp_str = "The fickleness of the world I have to make myself disguised as a hedgehog."
value = "<a href='http://www.baidu.com'>点击</a>"
return render(request, "guolvqi.html", {'name': name,
"num": num,
"now": now,
"temp_str": temp_str,
"value": value
})
templates/filter.html
{#默认值 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。#}
<p>{{ name|default:"majuqiang" }}</p>
{#长度#}
<p>{{ name|length }}</p>
{#格式化文件大小#}
<p>{{ num|filesizeformat }}</p> // 1.0kB
{#格式化时间#}
<p>{{ now|date:"Y-m-d" }}</p>
{#截断字符串#}
<p>{{ temp_str|truncatechars:10 }}</p>
{#safe#}
<p>{{ value|safe }}</p>
safe绝对安全的数据,才能加safe
—safe
相当于jQuery里的html
方法
模板语法之标签
标签看起来像是这样的:{% tag %}
-
for
循环{% for i in list %} {{ i }} {% endfor %}
{#for循环 dict#} {% for k,v in dict1.items %} <p>{{ k }} --- {{ v }}</p> {% empty %} <p>对不起。</p> {% endfor %}
可以利用
{% for i in list reversed %}
反向完成循环。 -
if
控制语句{% if 条件 %} ... {% elif %} ... {% else %} ... {% endif %}
<h3>标签</h3> {#for循环 list#} {% for i in person_list %} 循环序号可以通过{{forloop}}显示 {# 序号从1开始#} {# <p>{{ forloop.counter }}:{{ i.name }} === {{ i.eat }}</p> #} {# 序号从0开始#} {# <p>{{ forloop.counter0 }}:{{ i.name }} === {{ i.eat }}</p>#} {# 倒序#} {# <p>{{ forloop.revcounter }}:{{ i.name }} === {{ i.eat }}</p>#} {# 倒序,最后一个为0#} {# <p>{{ forloop.revcounter0 }}:{{ i.name }} === {{ i.eat }}</p>#} {# {% if forloop.first %}#} {# {{ i.name }}|#} {# {% endif %}#} {% if forloop.last %} {{ i.name }} {% else %} {{ i.name }} | {% endif %} {# if 最后一条(true):#} {# name #} {# else:#} {# name |#} {% endfor %}
-
with
使用一个简单地名字缓存一个复杂的变量{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
-
csrf_token
放在
form
表单里面,这个标签用于跨站请求伪造保护
自定义标签和过滤器
- 在
settings
中的INSTALLED_APPS
配置当前app,不然django无法找到自定义的simple_tag.
- 在app中创建
templatetags
模块(模块名只能是templatetags)
- 创建任意 .py 文件,如:
my_tags.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改变
@register.filter
def my_filter(v1, v2):
return v1 * v2
@register.simple_tag
def my_tag1(v1, v2, v3):
return v1 * v2 * v3
@register.simple_tag
def my_html(v1, v2):
temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
return mark_safe(temp_html)
-
在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py
{% load my_tags %}
-
使用simple_tag和filter(如何调用)
<body>
{% load my_tags %}
<h3>自定制过滤器</h3>
{{ 1|my_filter:2 }}
<hr>
<h3>自定制标签</h3>
{% my_tag1 1 2 3 %}
<p>{% my_html "id_test" "class_test" %}</p>
</body>
注意:filter可以用在if等语句后,simple_tag不可以