Chapter VI, page assembly

Chapter VI, page assembly

A batch insert data

First of all

We want to write a batch into the database and display the code on the page

Preparatory

#models.py
from django.db import models

# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
#老规矩 执行命令行 完成数据的迁移
mikemigrations
migrate
#views.py
def index(request):
    # 1.往书籍表中插入数据 1000
    for i in range(1000):  # 这种插入方式 效率极低
        models.Book.objects.create(title='第%s本书'%i)
    book_queryset=models.Book.objects.all()
    return render(request,'index.html',locals())
#index.html
<body>
{% for book_obj in book_queryset %}
    <p>{{ book_obj.title }}</p>
{% endfor %}
</body>

Results Improvement Project

Run the project, find the page on the data due to the insertion of data caused by too long to wait too long to show time, low efficiency of this original insert mode thief

To solve this problem

Introduced bulk_create

#仅在views.py修改一下index函数
book_list = []
for i in range(100000):
     book_list.append(models.Book(title='第%s本书'%i))
 models.Book.objects.bulk_create(book_list)  # 批量插入数据
  return render(request,'index.html',locals())

Improved project results

Soon the page quickly shows up

Second, the introduction of pager

Have large amounts of data on a web page after paging through the effect of the completion of data quickly show what

Pure hand line and do a custom pager

#views.py
def index(request):
    # 1.获取用户想要访问的页码数
    current_page = request.GET.get('page',1)  # 如果没有page参数 默认就展示第一页
    # 转成整型
    current_page = int(current_page)
    # 2.每页展示10条数据
    per_page_num = 10

    # 3.定义起始位置和终止位置
    start_page = (current_page - 1) * per_page_num
    end_page = current_page * per_page_num

    # 4.统计数据的总条数
    book_queryset = models.Book.objects.all()
    all_count = book_queryset.count()

    # 5.求数据到底需要多少页才能展示完
    page_num, more = divmod(all_count,per_page_num)  # divmod(100,10)
    if more:
        page_num += 1
    # page_num就觉得了 需要多少个页码
    page_html = ''
    xxx = current_page  # xxx就是用户点击的数字
    if current_page < 6:
         current_page = 6
    for i in range(current_page-5,current_page+6):
        if xxx == i:
            page_html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
        else:
            page_html += '<li><a href="?page=%s">%s</a></li>' % (i, i)

    book_queryset = book_queryset[start_page:end_page]
    return render(request,'index.html',locals())    
#index.html部分核心代码
{% for book_obj in book_queryset %}
    <p>{{ book_obj.title }}</p>
{% endfor %}
<nav aria-label="Page navigation">
  <ul class="pagination">
    <li>
      <a href="#" aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
      </a>
    </li>
    {{ page_html|safe }}
    <li>
      <a href="#" aria-label="Next">
        <span aria-hidden="true">&raquo;</span>
      </a>
    </li>
  </ul>
</nav>

By pure hand line and pager pager probably understand the principle, the above code only need to have ideas on the line after not really want pure hand line and Ha ha ha, that other people how to use pager packaged it?

Very simple, look at me operation

Create a folder Create a folder named utils mypage.py in app01, the following code directly copied in the past

 class Pagination(object):
    def __init__(self,current_page,all_count,per_page_num=2,pager_count=11):
        """
        封装分页相关数据
        :param current_page: 当前页
        :param all_count:    数据库中的数据总条数
        :param per_page_num: 每页显示的数据条数
        :param pager_count:  最多显示的页码个数
        
        用法:
        queryset = model.objects.all()
        page_obj = Pagination(current_page,all_count)
        page_data = queryset[page_obj.start:page_obj.end]
        获取数据用page_data而不再使用原始的queryset
        获取前端分页样式用page_obj.page_html
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1

        if current_page <1:
            current_page = 1

        self.current_page = current_page

        self.all_count = all_count
        self.per_page_num = per_page_num


        # 总页码
        all_pager, tmp = divmod(all_count, per_page_num)
        if tmp:
            all_pager += 1
        self.all_pager = all_pager

        self.pager_count = pager_count
        self.pager_count_half = int((pager_count - 1) / 2)

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_num

    @property
    def end(self):
        return self.current_page * self.per_page_num

    def page_html(self):
        # 如果总页码 < 11个:
        if self.all_pager <= self.pager_count:
            pager_start = 1
            pager_end = self.all_pager + 1
        # 总页码  > 11
        else:
            # 当前页如果<=页面上最多显示11/2个页码
            if self.current_page <= self.pager_count_half:
                pager_start = 1
                pager_end = self.pager_count + 1

            # 当前页大于5
            else:
                # 页码翻到最后
                if (self.current_page + self.pager_count_half) > self.all_pager:
                    pager_end = self.all_pager + 1
                    pager_start = self.all_pager - self.pager_count + 1
                else:
                    pager_start = self.current_page - self.pager_count_half
                    pager_end = self.current_page + self.pager_count_half + 1

        page_html_list = []
        # 添加前面的nav和ul标签
        page_html_list.append('''
                    <nav aria-label='Page navigation>'
                    <ul class='pagination'>
                ''')
        first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
        page_html_list.append(first_page)

        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)

        page_html_list.append(prev_page)

        for i in range(pager_start, pager_end):
            if i == self.current_page:
                temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)
            else:
                temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
            page_html_list.append(temp)

        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
        page_html_list.append(next_page)

        last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
        page_html_list.append(last_page)
        # 尾部添加标签
        page_html_list.append('''
                                           </nav>
                                           </ul>
                                       ''')
        return ''.join(page_html_list)

Instructions

#后端views.py
from app01.utils.mypage import Pagination
# 使用封装好的分页器代码
def login(request):
    book_queryset = models.Book.objects.all()
    #获取当前用户点击的页码
    current_page = request.GET.get('page',1)
    #获取数据的总数量
    all_count = book_queryset.count()
    # 1.实例化产生对象
    page_obj = Pagination(current_page=current_page,all_count=all_count)
    # 2.对真实数据进行切片操作
    page_queryset = book_queryset[page_obj.start:page_obj.end]
    return render(request,'login.html',locals())

Do not forget the tip

#index.html
{% for book_obj in page_queryset %}
                <p>{{ book_obj.title }}</p>
            {% endfor %}
            {{ page_obj.page_html|safe }}

Well, white prostitute hand code

Guess you like

Origin www.cnblogs.com/demiao/p/11760782.html