上一篇文章链接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>