每次删掉0001_initial.py,然后修改settings.py中的数据库,重新执行迁移。

变量

视图传递给模板的数据;要遵守标识符规则;语法:

注意:

1.如果使用的变量不存在,则插入的是空字符串

2.在模板中使用点语法(stu.sname) 字典查询 属性或者方法 数字索引

3.在模板中不能传递参数(stu.getname)

标签

语法:{% tag %}

作用:

1.在输出中创建文本

2.控制逻辑和循环

if:语句3

for:

forloop.counter:循环进行的次数

empty:表示列表为空的情况

//students.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生列表</title>
</head>
<body>
<h1>学生列表</h1>
<ul>
{% for stu in students %}
<li>
{{forloop.counter}}--{{stu.sname}}--{{stu.sgrade}}
</li>
{% empty %}
<li>目前没有学生</li>
{% endfor%}
</ul>

</body>
</html>

comment:注释

{% comment %}
多行注释
{% endcomment %}
{# 单行注释 #}

ifequal/ifnotequal:

{% ifequal 值1 值2 %}
值1==值2
{% endifequal %}

include:架子啊模板并以标签内的参数渲染

{% include 模板目录 参数1 参数2 %}

url:反向解析

{% url 'namespace:name' 参数1 参数2 %}

csrf_token:用于跨站请求伪造保护

{% csrf_token %}

block/extends:用于模板的继承

autoescape:用于HTML的转义

过滤器

语法:{{% var|过滤器%}}

作用:在变量被显示前修改它

<h1>{{str|upper}}</h1> //可以让str的字母转成大写再显示

过滤器可以传递参数,参数用引号引起来

<h1>{{list|join:'#'}}</h1>

如果一个没有被提供,或者值为false、空,可以使用默认值

{{ var|default:'没有' }}

根据给定格式转换日期为字符串:

{{ datevalue|date:'y-m-d' }}

HTML转义:escape

加减乘除取模:

{{ num|add:10 }}
{{ num|add:-5 }}
<!--num/1*5-->
{{% widthratio: num 1 5%}}
<!--num/5*1-->
{{% widthratio: num 5 1%}}
<!--num%2-->
{{% num|divisibleby:2 %}}

反向解析

#project/urls.py
url(r'^sunck/',include('myapp.urls',namespace='app'))
#myapp/urls.py
url(r'^good/(\d+)$',views.good,name='good')
#index.html
<a href="{% url 'app:good' 1 %}">链接</a>
#其实反向解析相当于把sunck/代进app,把good/代进good,然后正则匹配的(/d+)在这里对应1

模板继承

作用:可以减少页面内容的重复定义,实现页面的重用

block标签:在父模板中预留区域,子模板去填充

语法:{% block 标签名 %}   {% endblock 标签名 %}

extends标签:继承模板,需要写在模板文件的第一行

语法:{% extends 父模板路径 %}
//base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#header{
width:100%;
height:100px;
background-color:red;
}
#footer{
width:100%;
height:100px;
background-color:blue;
</style>
</head>
<body>
<div id="header">header</div>
<div id="main">
{% block main%}

{% endblock main%}
</div>
<div id="footer">footer</div>
</body>
</html>
//main.html
{% extends 'myapp/base.html'%}
{% block main %}
<h1>sunck is a good man</h1>
{% endblock main %}

HTML转义

return render(request,'myapp/index.html',
{"stu":student,"str":"hello world",
"list":["good","nice","handsome"],
'code':'<h1>sunck is a very good man</h1>'})
{{code}} //此处的code被当作普通字符串渲染
{{code|safe}} //此处的code被当作html渲染
{% autoescape off %}
{{code}} //此处的code被当作html渲染
{% endautoescape %}
{% autoescape on %}
{{code}} //此处的code被当作普通字符串渲染
{% endautoescape %}

CSRF跨站请求伪造

概述:某些恶意网站包含链接、表单、按钮、js利用登录用户在浏览器中认证,从而攻击服务器(如下面的实例中,攻击者拷贝网页源代码,然后将

改为即可进行恶意攻击)

防止CSRF:

1.在settings.py文件中的MDIILEWARE增加'django.middleware.csrf.CsrfViewMiddleware'

2.在表单中增加{% csrf_token%},其实就是加了验证,并没有绝对的安全,需要隐藏
//postfile.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/showinfo/" method="post">
{% csrf_token %}
姓名:<input type="text" name="username"/>
<hr/>
密码:<input type="password" name="passwd"/>
<hr/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
//showinfo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>name:{{username}}</h1>
<h1>password:{{passwd}}</h1>
</body>
</html>
#views.py
def postfile(request):
return render(request,'myapp/postfile.html')

def showinfo(request):
name=request.POST.get('username')
pwd = request.POST.get('passwd')
return render(request,'myapp/showinfo.html',
{"username":name,
"passwd":pwd})

验证码

作用:

1.防止暴力请求

2.防止csrf的一种方式

用到的数据:

insert into myapp_grades(gname,gdate,ggirlnum,gboynum,isDelete) values(“python01”,”2017-2-4”,10,50,0),(“python02”,”2017-5-4”,10,20,0),(“python03”,”2018-8-5”,50,50,0),(“python04”,”2018-6-15”,10,42,0);

insert into myapp_students(sname,sgender,scontend,isDelete,sgrade_id,sage) values(“蔡徐坤”,0,”我叫蔡徐坤”,0,4,20),

(“刘德华”,0,”我叫刘德华”,0,1,25),

(“陈瑞豪”,0,”我叫陈瑞豪”,0,3,18),

(“黑雪姬”,1,”我叫黑雪姬”,0,2,14),

(“有田春雪”,0,”我叫有田春雪”,0,2,13);


Shiroha