昨日回顾
1 ajax:异步的javascript的xml,同时可以发出很多ajax的请求,局部刷新
2 本质就是使用javascript这门语言发送http请求,(异步),原生,jquery的ajax方法,axios
3 如何使用(借助于jquery)
# 默认编码方式是urlencoded
$
.ajax({
url
:/books
/?name
=lqz
,
method
:'post/get',
data
:{name
:'lqz',age
:19},
success
:function (data
){
打印,弹窗,渲染页面(js dom操作,修改页面
)
}
})
4 上传文件
var formdata
=new Formdata()
formdata
.append('name','lqz')
formdata
.append('myfile',$('#id_file')[0].files
[0])
$
.ajax({
url
:/books
/?name
=lqz
,
method
:'post/get',
processData
:false,
contentType
:false,
data
:formdata
,
success
:function (data
){
打印,弹窗,渲染页面(js dom操作,修改页面
)
}
})
# 后端代码写一套即可:使用form表单传,postman,ajax传,都是一样的
5 上传json格式
$
.ajax({
url
:/books
/?name
=lqz
,
method
:'post/get',
contentType
:'application/json',
data
:字符串(json格式)
,
success
:function (data
){
打印,弹窗,渲染页面(js dom操作,修改页面
)
}
})
6 后端返回数据
-HttpResponse:它没有指定,text
/html
-JsonResponse:它指定了响应编码:application
/json
-ajax方法:会去看响应编码是什么,如果是application
/json,自动调用
JSON.parser(),如果不是json格式,就不处理
-于是:success:
function (data
) 可能是个字符串,也可能是个对象,响应编码决定的
7 js中json序列化和反序列化
-JSON.parser()
-JSON.stringify(data
)
8 django内置的序列化器
-需要会自己转(把对象转成json格式)
-自己写(局限性,以后再转publish,还得再写一遍,不通用)
ll
=[]
for book
in book_list
:
ll
.append({'name':book
.name
,'age':book
.age
})
return JsonResponse(ll
,safe
=False
)
{name
:lqz
,age
:18,hobbys
:[{hobbyname
:'篮球',hobbyid
:1},{hobbyname
:'足球',hobbyid
:2}]}
[{name
:lqz
,age
:18},{name
:egon
,age
:18},{name
:zs
,age
:18}]
今日内容
l
=[]
for i
in range(100):
book
= models
.Book
(name
=f
'书{i}', price
=i
)
l
.append
(book
)
models
.Book
.objects
.bulk_create
(l
,10)
class Meta:
ordering
= ('id',)
1 分页器组件介绍
1 项目数据量大了以后
,涉及到分页
,一页一页的加载显示
2 django中分页器组件
,把分页常用的东西
,封装到一个类中
3 实例化一个对象
,对象里有属性和方法
from django
.core
.paginator
import Paginator
def func139_1(request
):
book_list
= models
.Book
.objects
.all()
paginator
= Paginator
(book_list
, 10)
print(paginator
.per_page
)
print(paginator
.count
)
print(paginator
.num_pages
)
print(paginator
.page_range
)
page
= paginator
.page
(2)
print(page
.has_next
())
print(page
.next_page_number
())
print(page
.has_previous
())
print(page
.previous_page_number
())
print(page
.object_list
)
print(page
.number
)
return render
(request
, 'func139_1.html', locals())
2 分页器的简单使用
def index(request
):
page_num_int
=int(request
.GET
.get
('page',1))
book_list
= models
.Book
.objects
.all()
paginator
= Paginator
(book_list
, 10)
page_range
= paginator
.page_range
page
= paginator
.page
(page_num_int
)
return render
(request
, 'index.html', {'page_range':page_range
,'page':page
,'page_num_int':page_num_int
})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<title>Title
</title>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<table class="table">
<thead>
<tr>
<th>id
</th>
<th>名字
</th>
<th>价格
</th>
</tr>
</thead>
<tbody>
{% for book in page.object_list %}
<tr>
<td>{{ book.id }}
</td>
<td>{{ book.name }}
</td>
<td>{{ book.price }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="text-center">
<nav aria-label="Page navigation">
<ul class="pagination">
{% if page.has_previous %}
<li>
<a href="/?page={{ page.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% else %}
<li class="disabled">
<a href="" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% endif %}
{% for page_num in page_range %}
{% if page_num_int == page_num %}
<li class="active"><a href="/?page={{ page_num }}">{{ page_num }}
</a></li>
{% else %}
<li><a href="/?page={{ page_num }}">{{ page_num }}
</a></li>
{% endif %}
{% endfor %}
{% if page.has_next %}
<li>
<a href="/?page={{ page.next_page_number }}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
{% else %}
<li class="disabled">
<a href="" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
{% endif %}
</ul>
</nav>
</div>
</div>
</div>
</div>
</body>
</html>
3 分页器进阶使用
显示左
5,右
5,总共
11个页,
1 如果总页码大于
11
1.1 if 当前页码减
5小于
1,要生成
1到
12的列表(顾头不顾尾,共
11个页码)
page_range
=range(1,12)
1.2 elif 当前页码
+5大于总页码,生成当前页码减
10,到当前页码加
1的列表(顾头不顾尾,共
11个页码)
page_range
=range(paginator
.num_pages
-10,paginator
.num_pages
+1)
1.3 else 生成当前页码
-5,到当前页码
+6的列表
page_range
=range(current_page_num
-5,current_page_num
+6)
2 其它情况,生成的列表就是pageinator的page_range
page_range
=paginator
.page_range
def index(request
):
page_num_int
= int(request
.GET
.get
('page', 1))
book_list
= models
.Book
.objects
.all()
paginator
= Paginator
(book_list
, 1)
if paginator
.num_pages
> 11:
if page_num_int
- 5 < 1:
page_range
= range(1, 11)
elif page_num_int
+ 5 > paginator
.num_pages
:
page_range
= range(paginator
.num_pages
- 10, paginator
.num_pages
+ 1)
else:
page_range
= range(page_num_int
- 5, page_num_int
+ 5)
else:
page_range
= paginator
.page_range
page
= paginator
.page
(page_num_int
)
return render
(request
, 'index.html', {'page_range': page_range
, 'page': page
, 'page_num_int': page_num_int
})
模版文件同上
4 form组件介绍
1 注册功能
,登陆功能
,前段需要校验
(字段长度
,邮箱是否合法
...)
2 前端校验可以没有
,后端校验是必须的
,使用传统方式
,if判断写的很多
3 借助于forms组件 可以快速实现字段的校验
()
from django
import forms
class MyForm(forms
.Form
):
name
= forms
.CharField
(required
=True, max_length
=32, min_length
=3, label
='用户名')
email
= forms
.EmailField
(label
='邮箱')
age
= forms
.IntegerField
(max_value
=200,min_value
=0,label
='年龄')
5 form组件校验数据
def func139_2(request
):
data
= {'name': 'lq', 'email': "3333"}
form
= myforms
.MyForm
(data
=data
)
if form
.is_valid
():
print('校验成功')
print(form
.cleaned_data
)
else:
print(form
.cleaned_data
)
print('校验失败')
print(form
.errors
)
print(type(form
.errors
))
print(form
.errors
.as_json
())
print(form
.errors
.as_data
())
return HttpResponse
('ok')
6 forms渲染模版功能
def register(request
):
if request
.method
=='GET':
form
=myforms
.MyForm
()
return render
(request
,'register.html',{'form':form
})
elif request
.method
=='POST':
form
=myforms
.MyForm
(request
.POST
)
if form
.is_valid
():
print('校验通过,存数据库')
else:
print(form
.errors
.as_data
())
print('校验失败,返回错误')
return HttpResponse
('ok')
# 模版文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title
</title>
</head>
<body>
<hr>
<h1>手动创建模板
</h1>
<form action="" method="post">
<p>用户名:
<input type="text" name="name"></p>
<p>邮箱:
<input type="text" name="email"></p>
<p>年龄:
<input type="text" name="age"></p>
<p><input type="submit" value="提交"></p>
</form>
<hr>
<h1>半自动渲染模板1
</h1>
<form action="" method="post">
<p>用户名:{{ form.name }}
</p>
<p>邮箱:{{ form.email }}
</p>
<p>年龄:{{ form.age }}
</p>
<p><input type="submit" value="提交"></p>
</form>
<h1>半自动渲染模板2(用的最多)
</h1>
<form action="" method="post">
<p>{{ form.name.label }}--{{ form.name }}
</p>
<p>{{ form.email.label }}---{{ form.email }}
</p>
<p>{{ form.age.label }}---{{ form.age }}
</p>
<p><input type="submit" value="提交"></p>
</form>
<h1>半自动渲染模板3(用的最多)
</h1>
<form action="" method="post">
{% for foo in form %}
<p>{{ foo.label }} :{{ foo }}
</p>
{% endfor %}
<p><input type="submit" value="提交"></p>
</form>
<h1>全自动(了解)
</h1>
<form action="" method="post">
{# {{ form.as_ul }}#}
{{ form.as_p }}
{#
<table>#}
{# {{ form.as_table }}#}
{#
</table>#}
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
作业
name
= forms
.CharField
(min_length
=4, label
="姓名", error_messages
={"min_length": "太短了", "required": "该字段不能为空!"})
from django
import forms
from django
.core
.exceptions
import ValidationError
from app01
import models
class EmpForm(forms
.Form
):
name
= forms
.CharField
(min_length
=5, label
="姓名", error_messages
={"required": "该字段不能为空!",
"min_length": "用户名太短。"})
age
= forms
.IntegerField
(label
="年龄")
salary
= forms
.DecimalField
(max_digits
=5, decimal_places
=2, label
="工资")
r_salary
= forms
.DecimalField
(max_digits
=5, decimal_places
=2, label
="请再输入工资")
def clean_name(self
):
val
= self
.cleaned_data
.get
("name")
if val
.isdigit
():
raise ValidationError
("用户名不能是纯数字")
elif models
.Emp
.objects
.filter(name
=val
):
raise ValidationError
("用户名已存在!")
else:
return val
def clean(self
):
val
= self
.cleaned_data
.get
("salary")
r_val
= self
.cleaned_data
.get
("r_salary")
if val
== r_val
:
return self
.cleaned_data
else:
raise ValidationError
("请确认工资是否一致。")
views
.py 文件代码:
app01
/views
.py
def add_emp(request
):
if request
.method
== "GET":
form
= EmpForm
()
return render
(request
, "add_emp.html", {"form":form
})
else:
form
= EmpForm
(request
.POST
)
if form
.is_valid
():
data
= form
.cleaned_data
data
.pop
("r_salary")
models
.Emp
.objects
.create
(**data
)
return redirect
("/index/")
else:
clear_errors
= form
.errors
.get
("__all__")
return render
(request
, "add_emp.html", {"form": form
, "clear_errors": clear_errors
})