python之Django的入门07------筛选和排序功能

上一篇文章链接Django06

我们接着上一篇文章的基础上,来继续了解进一步的Django框架

1.简单的筛选和排序:

 urls的:
          url(r'^list/(?P<brande>.+?)/(?P<price>\d+)/(?P<order_style>.+?)$',ShowCarList.as_view(),name='list'),

    views的:
        class ShowCarList(View):
        def get(self,request,brande,price,order_style):
            '''校验车辆品牌'''
            try:
                brande = Brande.objects.get(name=brande)
            except Exception as e:
                return HttpResponse('该品牌不存在')
            car_list = CarDetail.objects.filter(brande__exact=brande)
            print(car_list)


            # 获取排序方式
            order_list = ['car_price', 'age', 'licheng_shu']
            if order_style in order_list:
                car_list = CarDetail.objects.filter(brande__exact=brande).order_by(order_style)
            else:
                car_list = CarDetail.objects.filter(brande__exact=brande).order_by('car_price')
            print(car_list)

            context = {'car_list': car_list}

            return render(request, 'car_list.html', context=context)


对应的静态页面T语言

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/list/BWM/12/a">默认排序</a>
<a href="/list/BWM/12/car_price">价格排序</a>
<a href="/list/BWM/12/age">车龄排序</a>
<a href="/list/BWM/12/licheng_shu">里程数排序</a>

<img>

{% for obj in car_list %}


    <li>品牌:{{ obj.brande }}</li>
    <li>型号:{{ obj.style }}</li>
    <li>二手价格:{{ obj.car_price }}</li>
    <li>车辆:{{ obj.age }}</li>
    <li>里程数:{{ obj.licheng_shu }}</li>
    <br>
{% endfor %}

</ul>

</body>
</html>

在网页展示的静态页面上点击这四个排序,下面展示的数据就会按照其规律展示





2.真实的筛选和排序:

	urls的:
	#匹配到品牌、 页数和排序方式
	url(r'^list_car/(?P<brande>.+?)/(?P<page_order>.+?)$',ShowCarListView.as_view(),name='list_car'),

	
	views的:
	
		class ShowCarListView(View):
		    def get(self,request,brande,page_order):
		        print(brande)
		        print(page_order)
		        if not page_order:
		            return HttpResponse('page_order没有值')

		        try:
		            result = re.search(r'o(\d+)i(.*)',page_order)
		            page = result.group(1)
		            order_by = result.group(2)
		            print(page)
		            print(type(page))
		            print(order_by)
		            print(type(order_by))
		
		
		        except:
		            #如果找不到就返回第一页和默认排序1
		            page = 1
		            order_by = 1
		
		
		        try:
		            page = int(page)
		        except Exception as e:
		            page = 1
		
		
		        try:
		            brande_search = Brande.objects.get(name=brande)
		        except:
		            return redirect(reverse('car:index'))
		
		
		        # order_list = ['default','car_price', 'age', 'mileage']
		        if order_by == 2:
		            car_list = CarDetail.objects.filter(brande__exact=brande_search).order_by('car_price')
		        elif order_by == 3:
		            car_list = CarDetail.objects.filter(brande__exact=brande_search).order_by('age')
		        elif order_by == 4:
		            car_list = CarDetail.objects.filter(brande__exact=brande_search).order_by('licheng_shu')
		        else:
		            order_by = 1
		            car_list = CarDetail.objects.filter(brande__exact=brande_search).order_by('car_price')
		
		
		
		        paginator = Paginator(car_list, 1)    #1条数据为一页,实例化分页对象
		
		        total_page_num = paginator.num_pages    #总页数
		        print('总共分了多少页', total_page_num)
		
		        #page是当前页数,total_page_num是总页数
		        #如果当前页数数字大于总页数,回到第一页
		        if page > total_page_num:
		            page = 1
		        #如果总页数小于五页,展现五页
		        if total_page_num < 5:
		            pages = range(1, total_page_num + 1)
		        #如果当前页数小于3,展示1-6页
		        elif page <= 3:
		            pages = range(1, 6)
		        #如果当前页数加2大于等于总页数,展示最后五页
		        elif page + 2 >= total_page_num:
		            pages = range(total_page_num - 4 ,total_page_num+1)
		        #其他时候展示当前页的前两页和后两页
		        else:
		            pages = range(page-2,page + 3)
		
		
		
		        car_page = paginator.page(page)  # 返回给定的从1开始的页码的Page对象。
		
		        context = {
		            'car_page': car_page,
		            'pages': pages,
		            'sort': order_by,
		            'brande':brande,
		            'order_by':order_by,
		        }
		
		        return render(request, 'car_list.html', context=context)


	HTML的:
				<!DOCTYPE html>
				<html lang="en">
				<head>
				    <meta charset="UTF-8">
				    <title>Title</title>
				</head>
				<body>
				
				
				
				<ul>
				
				
				 {% for car in car_page %}
				     <li>
				     <a href="{% url 'car:car_detail' car.id %}"> {{ car.style }} </a>
				     <div> {{ car.car_price }}</div>
				     </li>
				     <br>
				{% endfor %}
				
				</ul>
				
				如果有前一页就显示下面的
				{% if car_page.has_previous %}
				    <a href="/list_car/{{ brande }}/o{{ car_page.previous_page_number }}i{{ order_by }}">前一页</a>
				{% endif %}
				
				页面跳转
				{% for page in pages %}
				
				    <a  href="/list_car/BWM/o{{ page }}i{{ sort }}"> {{ page }} </a>
				
				{% endfor %}
				
				如果有后一页就显示下面的
				{% if car_page.has_next %}
				    <a href="/list_car/{{ brande }}/o{{ car_page.next_page_number }}i{{ order_by }}">后一页</a>
				{% endif %}
				
				
				
				
				
				
				</body>
				</html>

猜你喜欢

转载自blog.csdn.net/sui_yi123/article/details/83000512
今日推荐