hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

django实战(二)--带多字段隐约查询的分页(也是不容易)

2019-11-18杂谈搜奇网33°c
A+ A-

上节我们完成了分页功用,这节我们要完成对隐约查询后的效果举行分页。(引入了bootstrap框架)

urls.py

from django.urls import path
from . import views

app_name='person'
urlpatterns=[
    path('curd/',views.curd_index),
    path('curd/<int:pn>',views.curd_index,name="curdindex"),
]

models.py

class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64,null=False,unique=True)

    def __str__(self):
        # return "publisher_name:{}".format(self.name)
        return "{}".format(self.name)

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=128,null=False)
    introduce=models.TextField(max_length=120)
    publisher = models.ForeignKey(to='Publisher',on_delete=None)

    def __str__(self):
        return "book_title:{}".format(self.title)
    class Meta:
        ordering=['id']

你说我对单个表不就好了,为啥还要搞个外键出来!!!

views.py

from django.db.models import Q
from django.shortcuts import render
from .models import Book
from django.core.paginator import Paginator, EmptyPage

def curd_index(request,pn=1):
    #猎取前端收到的查询的值,默认值为空
    query=request.GET.get('query')
    #假如存在,则对title和publisher举行隐约查询
    if query:
        book_obj = Book.objects.all().filter(Q(title__contains=query)|Q(publisher__name__contains=query))
    #不然取得一切的纪录,并设置query的初始值为''
    else:
     query='' book_obj
=Book.objects.all() #将取得的纪录传给Paginator,每页显现5条 paginator=Paginator(book_obj,5) #这里做非常推断,稍后再讲 try: page=paginator.page(pn) except EmptyPage: page=paginator.page(1) #将page和查询字段传给前端 context={ 'page':page, 'query':query, } return render(request,'curd/curd.html',context=context)

curd.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
    <script src="/static/bootstrap/js/bootstrap.js"></script>
    <title>Document</title>
</head>
<body>
<div style="width: 100%";>
    <h3 align="center">书本列表</h3>
    <table class="table" style="table-layout: fixed;">
        <div style="float: right">
        <form method="get" action="" >
            <input type="text" name="query"/>
            <input type="submit" name="submit" class="btn btn-primary input-sm"/>
        </form>
        </div>
        <tr>
            <th>id</th>
            <th>title</th>
            <th>publisher</th>
            <th>introduce</th>
        </tr>
        <tr>
        {% for item in page%}
            <td>{{item.id}}</td>
            <td>{{item.title}}</td>
            <td>{{item.publisher}}</td>
            <td>{{item.introduce}}</td>
        </tr>
        {% endfor %}
    </table>
</div>
<!--底部分页按钮显现-->
<div style="position: absolute;top: 30  %;left: 44%">
    <nav aria-label="Page navigation">
        <div class="pagination">
            <ul class="pagination" >
            {% if page.has_previous %}
                <li><a href="/curd/{{page.previous_page_number}}?query={{query}}"   aria-label="Previous">
                    <span aria-hidden="true">&laquo;</span></a></li>
            {% endif %}

            {% for num in page.paginator.page_range%}
                {%if pindex == page.number%}
                    <li><a href="">{{ num }}</a></li>
                {%else%}
                    <li><a href="/curd/{{num}}?query={{query}}">{{ num }}</a></li>
                {%endif%}
             {% endfor %}

             {% if page.has_next %}
                 <li><a href="{% url 'person:curdindex' page.next_page_number%}?query={{query}}" aria-label="Next">
                      <span aria-hidden="true">&raquo;</span></a></li>
              {% endif %}
            </ul>
        </div>
    </nav>
</div>
</body>
</html>

启动服务器后:

 

 

 我们点击下一页:

 

 

 注意到浏览器中地点变成了http://127.0.0.1:8000/curd/2?query=,接下来,我们尝试输入“p”

 

我们按title举行了隐约查询,然则浏览器地点为:http://127.0.0.1:8000/curd/3?query=p&submit=%E6%8F%90%E4%BA%A4。我们查询后的/curd/3这里不该该是1么,从第一页最先?这就是我们之前举行非常掌握的缘由。假如我们不设置,就会报错Emptypage,因为不是从第三页最先的。我们尝试下一页,浏览器地点:http://127.0.0.1:8000/curd/2?query=p,这正如我们所说,跳转到第二页了,同时,我们依然位于隐约查询的列表中。因为我们在第一次举行隐约查询时,后端将从前端取得的query从新传回给了前端,并保存在url途径中,所以我们挑选页面的时刻,只是会转变页面的值,然后面的query依然是存在的。

我们再输入"广州":

 

 一样得到了按publisher挑选的效果,这是因为我们在隐约查询中举行了挑选。

补充:每纪录一篇,都要参考不少他人的东西,因为django的多样性,他人写的不可能完整合适本身,这就须要本身从中提取对本身有益的东西。

手艺总结:写完分页后,想到应当怎样依据隐约查询后的效果举行分页呢?实在就是一个传参,接收参数的历程。个中碰到的另一个坑就是,本身非要应用外键举行关联查询,在举行隐约查询时,publisher是外键,不能直接用publisher__contains,而应当用publisher__name__contains,不然会报错:FieldError。

照样一句话:每学一点东西,就更加觉得另有很多东西能够学,啊啊啊。

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
django实战(二)--带多字段隐约查询的分页(也是不容易)

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282204.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>