zoukankan      html  css  js  c++  java
  • Title

    一、视图CBV  

     1.urls
        url(r'^login.html$', views.Login.as_view()),
      2.views
        from django.views import View

        class Login(View):
          def get(self,request):
            return HttpResponse('from get')

          def post(self,request):
            return HttpResponse('from post')

    二、ORM补充

      正向操作
        result = models.UserInfo.objects.all()
        for obj in result:
        print(obj.name,obj.age,obj.ut_id,obj.ut.title,obj.ut.fo.new_name)#通过点外键名进行连表操作ut和fo都是外键名
      反向操作
        obj = models.UserType.objects.all().first()
        print(obj.id,obj.title,obj.userinfo_set_all()) # obj.userinfo_set_all()匹配用户类型相关的所有用户

        for row in obj.userinfo_set_all(): #遍历每一个用户对象     print(row.name,row.age)

    三、Django的自带分页

    url(r'^index.html$', views.index),
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>用户列表</h1>
        <ul>  {# 每页显示10条信息 #}
            {% for row in posts.object_list %}
                <li>{{ row.name }}</li>
            {% endfor %}
        </ul>
    
        <div>
            {% if posts.has_previous %} {# 如果有上一页,显示上一页的标签  #}
                <a href="/index.html?page={{ posts.previous_page_number }}">上一页</a>
            {% endif %}
    
            {% for num in posts.paginator.page_range %}
                <a href="/index.html?page={{ num }}">{{ num }}</a>
            {% endfor %}
    
            {% if posts.has_next %} {# 如果有下一页,显示上一页的标签  #}
                <a href="/index.html?page={{ posts.next_page_number }}">下一页</a>
            {% endif %}
        </div>
    </body>
    </html>
    index.html
    from django.core.paginator import Paginator,Page,PageNotAnInteger,EmptyPage
    def index(request):
        """
        分页
        :param request:
        :return:
        """
        # for i in range(300):
        #     name = "root" + str(i)
        #     models.UserInfo.objects.create(name=name,age=18,ut_id=1)
    
    
        current_page = request.GET.get('page')  # URL中获取第几页
    
        user_list = models.UserInfo.objects.all() # 数据库查询所有的数据
        paginator = Paginator(user_list,10)       # 页面显示出10条数据
        # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象
        try:
            posts = paginator.page(current_page)  # 创建page对象
        except PageNotAnInteger as e:           # 发生异常则默认跳到第一页
            posts = paginator.page(1)
        except EmptyPage as e:
            posts = paginator.page(1)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
        return render(request,'index.html',{'posts':posts})
    View.py

    四、Django的自定义分页

      前端模板

    {# 通过视图函数传过来的user_list是指定页码之间的数据库数据 #}
    {% for article in user_list %}
        <div class="article-item" style="padding: 5px 0">
            <div class="art-footer">
                <a href="#" class="foot" onclick="updown(this,{{ article.nid }},1);">
                    <span class="glyphicon glyphicon-thumbs-up"></span> {# fa fa-thumbs-up点赞图标#}
                    点赞({{ article.up_count }})         {# 点赞个数#}
                </a>
            </div>
        </div>
    {% endfor %}
    
    {# 在引入bootstrap的css文件后,把下面的代码放到前端模板html指定位置,显示页码图标 #}
    <nav aria-label="Page navigation">
      <ul class="pagination">
          {{ page_info.pager|safe }}
      </ul>
    </nav>

      后端视图函数处理

    def func(request):
        base_url = '/%s/%s/%s/' % (blog.user.username,key,val)      # 获取到当前跳转页面的URL
        article_list = models.Article.objects.filter(**conditions)  #数据库查询到的所有数据
        all_count = article_list.count()   # 获取数据库中指定对象的总条数
        # request.GET.get('page'):从URL中获取当前页 all_count:总条数 10:每页显示10条
        page_info = PageInfo(request.GET.get('page'), all_count, 2, base_url, 11)
        user_list = article_list[page_info.start():page_info.end()]  # 每页显示的数据
        
        return render(request,'index.html',
                            {
                            'user_list': user_list,
                            'page_info': page_info
                            })

      封装好的页码类处理

    class PageInfo(object):
        def __init__(self,current_page,all_count,per_page,base_url,show_page=11):
            """
            :param current_page: 当前页
            :param all_count: 数据库总行数
            :param per_page: 每页显示函数
            :return:
            """
            try:
                self.current_page = int(current_page)  #把URL中获取到的当前页转换为数字
            except Exception as e: # 转换出错则跳转到第一页
                self.current_page = 1
            self.per_page = per_page # 每页显示的条数
    
            a,b = divmod(all_count,per_page) # 总条数除以每页条数获得一共有多少页
            if b: # 如果有余数则证明剩下的不够每页显示的数目但是需要加一页
                a = a +1
            self.all_pager = a   # all_pager 表示总页数
            self.show_page = show_page  # show_page 数据很多时显示11页
            self.base_url = base_url    # 传入要跳转的URL地址
        def start(self):  # 取文章数据的时候
            return (self.current_page-1) * self.per_page  # 当前页减一乘以每页显示的条数  第几条
    
        def end(self):
            return self.current_page * self.per_page     # 当前页乘以每页显示的条数        到第几条
    
        def pager(self):
            page_list = []
            # half是用来显示前五页和后五页的一个数
            half = int((self.show_page-1)/2)   # 显示的页码减一除以二
    
            # 如果数据总页数 < 11
            if self.all_pager < self.show_page:
                begin = 1
                stop = self.all_pager + 1
            # 如果数据总页数 > 11
            else:
                # 如果当前页 <=5,永远显示1,11
                if self.current_page <= half:
                    begin = 1
                    stop = self.show_page + 1
                else:
                    if self.current_page + half > self.all_pager:   #当前页加五后大于总页码的时候
                        begin = self.all_pager - self.show_page + 1 # 起始页为最后一页往前倒11页
                        stop = self.all_pager + 1                   # 最后一页
                    else:
                        begin = self.current_page - half          # 当前页往前倒5页
                        stop = self.current_page + half + 1       # 当前页往后倒5页
    
            if self.current_page <= 1:  # 当前页小于等于1时,上一页不能点
                prev = "<li><a href='#'>上一页</a></li>"
            else: # 当前页大于1时,上一页能点
                prev = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url,self.current_page-1,)
            page_list.append(prev)  # 把标签放入列表中
    
            for i in range(begin,stop):
                if i == self.current_page: # 当前页等于i时证明当前页被选中加上active属性
                    temp = "<li class='active'><a  href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
                else:
                    temp = "<li><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
                page_list.append(temp) # 把标签放入列表中
    
            if self.current_page >= self.all_pager:  # 当前页大于等于最后一页时,下一页不能点
                nex = "<li><a href='#'>下一页</a></li>"
            else:
                nex = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url,self.current_page+1,)
            page_list.append(nex) # 把标签放入列表中
    
            return ''.join(page_list) # 返回一个拼接的字符串
    

      

  • 相关阅读:
    U3D shaderlab 相关指令开关
    CCF NOI1073
    CCF NOI1185
    CCF NOI1077(自然数的拆分问题 )
    CCF NOI1070(汉诺塔)
    CCF NOI1069
    2018年全国多校算法寒假训练营练习比赛(第一场)G.圆圈
    poj1941(递归)
    Codeforce914B (Conan and Agasa play a Card Game)
    Codeforce916B
  • 原文地址:https://www.cnblogs.com/guotianbao/p/7482273.html
Copyright © 2011-2022 走看看