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

django实战(二)--带多字段模糊查询的分页(也是不容易),第1张

概述模糊查询+分页

上节我们实现了分页功能,这节我们要实现对模糊查询后的结果进行分页。(引入了bootstrap框架)

urls.py

from django.urls import path . import vIEwsapp_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) 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=PublisherNone)    book_Title:{}.format(self.Title)     Meta:        ordering=[ID']

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

vIEws.py

from django.db.models import Qfrom django.shortcuts  renderfrom .models  Bookfrom django.core.paginator  Paginator,EmptyPagedef 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,} return render(request,curd/curd.HTMLen"><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="/> <input type=submit" 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 pagination"> <ul " > {% 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%/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=">&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。

还是一句话:每学一点东西,就越发感觉还有好多东西可以学,啊啊啊。

总结

以上是内存溢出为你收集整理的django实战(二)--带多字段模糊查询的分页(也是不容易)全部内容,希望文章能够帮你解决django实战(二)--带多字段模糊查询的分页(也是不容易)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1214375.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存