批量插入数据

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 其他操作不影响'''

forms组件

前戏
	写一个注册页面获取用户的用户名和密码
    发送到后端之后在后端完成对用户名和密码的数据校验
    	1.用户名里面不能含有JPZ
        2.密码不能为空
    将提示信息渲染到前端页面

1.前端页面标签书写
2.前端页面信息展示
3.后端数据校验

forms组件可以一条龙服务 帮你完成上面的三件事情
	1.渲染标签
    2.校验数据
    3.展示信息

forms组件校验数据

# 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.']}
"""
校验数据可以多传 但是不能少传(默认必填)
"""

forms组件渲染标签

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标签都需要你自己编写
posted on 2021-05-31 10:59  lzl_121  阅读(44)  评论(0编辑  收藏  举报