MTV之模板层(template)
Python的模板:HTML代码+模板语法
模板包括在使用时会被值替换掉的变量,和控制模板逻辑的标签
1、在Django模板中遍历复杂数据结构的关键是句点字符 .,句点符也可以引用对象的方法
语法:
{{var_name}}
template:
<h4>{{s}}</h4>
<h4>列表:{{1.0}}</h4>
<h4>字典:{{dic.name}}</h4>
<h4>日期:{{date.year}}</h4>
<h4>类对象列表:{{person_list.0.name}}</h4>
2、模板之过滤器
语法:
{{obj | filter_name:param}}
(1)、date
value=datetime.datetime.now()
{{ value | date:“Y-m-d”}}
(2)、default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。
{{ value | default:“nothing”}}
(3)、truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将可以翻译的省略号序列(“...”)结尾。
参数:要截断的字符数
例如:
{{ value | truncatechars:9}}
如果value是“Joel 是 a >,输出将为“Joel i ...”。
3、模板之标签
for标签
for循环,遍历每一个元素
{ % for person in person_list % }
<p>{{ person.name }}</p>
{% endfor %}
for标签带有一个可选的{% empty %}从句,在给出的组为空或者没有找到时,返回给界面的
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here </p>
{% endfor %}
if标签
{% if %}会对一个变量求值,如果它的值是“True”(存在,不为空,且不是Boolean类型的false值),对应的内容块会输出
{ % if num > 100 or num <0 %}
<p>无效</p>
{ % elif num > 80 or num <100 %}
<p>优秀</p>
{% else %}
<p>一般</p>
{% endif %}
csrf_token:提交数据时,需要使用 ,用于跨站请求伪造保护
4、自定义标签和过滤器
(1)、在settings中的INSTALLED_APPS配置当前app,否则Django找不到自定义的simple_tag
(2)、在app中创建templatetags模板
(3)、创建任意.py文件,如:my_tags.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library() # register的名字是固定的,不可改变
@register.filter # 定义过滤器
def multi(x,y):
return x*y
@register.simple_tag # 定义标签
def multi_tag(x,y,z):
return x*y*z
(4)、在使用自定义simple_tag和filter的html文件中导入之前创建的my_tags.py
{% load my_tags %}
(5)、调用simple_tag和filter
{ % load xxx % }
{{ num | filter_multi:2 }} #num=12,返回界面的值:24
5、模板继承(extend)
模板继承:最大程度上实现代码复用,减少代码重复
需要先创建一个基本的“骨架”模板,他包含站点中全部元素,并且能被子模板覆盖的blocks
先定义母版:比如:base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="side">
{% block side %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/">Blog</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
“子模板”工作是用它们的内容填充空的blocks。
block 标签定义了两个可以被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置
子模板
{% extends "base.html" %}
{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
extends标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,它将定位父模版base.html
继承注意事项:
(1)、模版中使用的第一个标签必须是 {% extends %} 标签。其他的任何情况下,模版继承都将无法工作。
(2)、在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容
(3)、为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:
{% block content %}
...
{% endblock content %}
在大型模版中,这个方法帮你清楚的看到哪一个 {% block %} 标签被关闭了。
(4)、不能在一个模版中定义多个相同名字的 block 标签。这个限制的存在是因为block标签的作用是“双向”的。这个意思是,block标签不仅提供了一个坑去填,它还在 _父模版_中定义了填坑的内容。如果在一个模版中有两个名字一样的 block 标签,模版的父模版将不知道使用哪个block的内容。
model基础
1、ORM映射关系
表名—————类名
字段—————属性
表记录————类实例对象
2、数据库中表与表的关系
确定是什么关系
if 一对多:
关联字段放在多的一方;
foreign key dep_id reference dep(id)
if 多对多:
创建第三章表
create table student_teacher(
id int primary key,
student_id int,
teacher_id int,
foreign key student_id reference student(id)
foreign key teacher_id reference teacher(id)
)
if 一对一:
foreign key ,关联字段可以放在两张表中任意一张
关联字段必须唯一约束
3、ORM表关系:
(1)、配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 's18day18', #你的数据库名称
'USER': 'root', #你的数据库用户名
'PASSWORD': '', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
}
}
(2)、 数据库引擎更改:
MYsqlDB---->pymysql
在应用的__init__文件中加入:
import pymysql
pymysql.install_as_MySQLdb()
单表操作:
# 插入数据
# 插入数据方式1,create有返回值:插入的记录对象:
book_obj=models.Book.objects.create(title=title,pubDate=pubdate,price=price,publish=publish)
print(book_obj.title)
print(book_obj.price)
# 插入数据方式2:
book_obj=models.Book(title=title,pubDate=pubdate,publish=publish)
book_obj.price=price
book_obj.save()