python自动化学习笔记之DAY18

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 是 >,输出将为“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()

posted @ 2017-11-16 23:23  糖果的海角sky  阅读(100)  评论(0编辑  收藏  举报