批量插入数据
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=
def home(request):
# 往book表中插入1万条书籍数据
# 效率极低
# for i in range(1,10001):
# models.Book.objects.create(title='第%s本书'%i)
# 批量插入
# book_list = []
# for i in range(1,10001):
# book_list.append(models.Book(title='第%s本书'%i))
# models.Book.objects.bulk_create(book_list)
自定义分页器
只需要掌握课上推导思路即可 无需再过多研究
from utils.mypage import Pagination
book_queryset = models.Book.objects.all()
page_obj = Pagination(request.GET.get('page',1),book_queryset.count())
page_queryset = book_queryset[page_obj.start:page_obj.end]
{% for book_obj in page_queryset %}
<p>{{ book_obj.title }}</p>
{% endfor %}
{{ page_obj.page_html|safe }}
多对多三种创建方式
第一种(全自动):
class Books(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
'''第三张表的扩展性极差 eg:无法添加额外的字段'''
第二种(纯手动):
class Books(models.Model):
title = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Books2Author(models.Model):
book_id = models.ForeignKey(to='Books')
author_id = models.ForeignKey(to='Author')
desc = models.CharField(max_length=32)
'''第三张表可以自定义 但是orm查询不太方便'''
第三种(半自动):
class Books(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author',
through='Books2Author',
through_fields=('book_id','author_id')
)
class Author(models.Model):
name = models.CharField(max_length=32)
# books = models.ManyToManyField(to='Books',
# through='Books2Author',
# through_fields=('author_id','book_id')
# )
class Books2Author(models.Model):
book_id = models.ForeignKey(to='Books')
author_id = models.ForeignKey(to='Author')
desc = models.CharField(max_length=32)
'''无法使用add\set\remove\clear 其他操作不影响'''
前戏
写一个注册页面获取用户的用户名和密码
发送到后端之后在后端完成对用户名和密码的数据校验
1.用户名里面不能含有JPZ
2.密码不能为空
将提示信息渲染到前端页面
1.前端页面标签书写
2.前端页面信息展示
3.后端数据校验
forms组件可以一条龙服务 帮你完成上面的三件事情
1.渲染标签
2.校验数据
3.展示信息
# forms代码书写
from django import forms
class MyForm(forms.Form):
# username字段最少不能少于3位 最多不能超过8位
username = forms.CharField(max_length=8,min_length=3)
# password字段最大值不能超过699
password = forms.IntegerField(max_value=699)
# email字段必须符合邮箱格式
email = forms.EmailField()
# 校验数据
from app01 import views
# 1.类加括号 传入字典即可
form_obj = views.MyForm({'username':'jason','password':'123','email':'嘿嘿嘿'})
# 2.判断数据是否合法(只有全部合法结果才为True)
form_obj.is_valid()
False
# 3.查看所有合法的数据
form_obj.cleaned_data
{'username': 'jason', 'password': 123}
# 4.查看所有不合法的数据及原因
form_obj.errors
{'email': ['Enter a valid email address.']}
"""
校验数据可以多传 但是不能少传(默认必填)
"""
def login(request):
# 1.先生成一个对象
form_obj = MyForm()
# 2.将该对象传递给html页面
return render(request,'login.html',locals())
方式1
简单粗暴 一次性渲染label文本和input框
{{ form_obj.as_p }}
"""
优点:速度快
缺点:封装程度高 不便于扩展
"""
方式2
一步步需要自己书写字段对象
{{ form_obj.username.label }}
{{ form_obj.username }}
"""
优点:字段之间相互解耦
缺点:字段多的时候书写麻烦
"""
方式3
for循环依次获取每个字段对象
{% for form in form_obj %}
<p>
{{ form.label }}:{{ form }}
</p>
{% endfor %}
'''推荐使用'''
# forms组件无法渲染提交按钮和form标签都需要你自己编写