当前位置:
首页 > Python基础教程 >
-
Django多条件筛选查询(4)
"""
获取当前url,进行值修改拼接
:param current_url: http://127.0.0.1:8000/test/goods-0-0-0-0.html
:param index:
:return:
"""
a_href_active = """
<a href="{href}" class="active">【{name}】</a>
"""
a_href_unactive = """
<a href="{href}">{name}</a>
"""
url_part_list = current_url.split('-')
if index == len(url_part_list)-1: # 最后一个带.html要特殊处理
if url_part_list[index] == str(item['id']) + '.html':
a_href = a_href_active
else:
a_href = a_href_unactive
url_part_list[index] = str(item['id']) + '.html'
else:
# print(item['id'], type(item['id'])) # item['id']是int类型
if url_part_list[index] == str(item['id']):
a_href = a_href_active
else:
a_href = a_href_unactive
url_part_list[index] = str(item['id'])
href = '-'.join(url_part_list)
if index in range(1, 4):
a_href = a_href.format(href=href, name=item['name'])
if index == len(url_part_list)-1:
a_href = a_href.format(href=href, name=item['status'])
return mark_safe(a_href)
多对多模型进行筛选
模型
# 课程分类
class Category(models.Model):
weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)
name = models.CharField(max_length=32, verbose_name='分类名称')
class Meta:
verbose_name = '分类方向'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
# 编程语言,一个课程分类里可能有多种编程语言,一种编程语言可能存在不同的课程分类
class Code(models.Model):
weight = models.IntegerField(default=0, verbose_name='权重(按从大到小排列)')
name = models.CharField(max_length=32, verbose_name='编程语言')
category = models.ManyToManyField(Category, related_name='codes', verbose_name='课程分类')
class Meta:
verbose_name = '编程语言'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
# 课程详情
class Course(models.Model):
STATUS_CHOICE = (
(0, '下线'),
(1, '上线')
)
LEVEL_CHOICE = (
(1, '初级'),
(2, '中级'),
(3, '高级')
)
status = models.IntegerField(choices=STATUS_CHOICE, default=1, verbose_name='状态')
level = models.IntegerField(choices=LEVEL_CHOICE, default=1, verbose_name='难度级别')
category = models.ForeignKey(Category, null=True, blank=True, related_name='courses', verbose_name='课程分类')
weight = models.IntegerField(default=0, verbose_name='权重(按从大到小排列)')
title = models.CharField(max_length=32, verbose_name='标题')
summary = models.CharField(max_length=100, verbose_name='简介')
image = models.ImageField(upload_to='images/course/%Y/%m', verbose_name='图片')
video_url = models.CharField(max_length=256, verbose_name='视频地址')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
verbose_name = '课程详情'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
路由
urlpatterns = [
# 访问形式http://127.0.0.1:8000/test/course-0-0-0.html,
# 第一个0代表课程分类,第二个0代表编程语言,第三个0代表课程级别
# 0代表全部,然后递增,当选择课程分类中的第一项,第一个0就会变成1
url(r'^course-(?P<code_id>\d+)-(?P<category_id>\d+)-(?P<level_id>\d+).html', course, name='course'),
]
视图
def course(request, *args, **kwargs):
print(args, kwargs) # () {'code_id': '0', 'category_id': '0', 'level_id': '0'}
request_path = request.path # http://127.0.0.1:8000/test/course-0-0-0.html
# 筛选字典
filter_dict = dict()
code_list = Code.objects.all().values('id', 'name')
category_list = Category.objects.all().values('id', 'name')
level_list = list(map(lambda x: {'id': x[0], 'name': x[1]}, Course.LEVEL_CHOICE))
if kwargs['code_id'] == '0':
if kwargs['category_id'] != '0':
category_list = Category.objects.filter(id=kwargs['category_id']).values('id', 'name')
category = get_object_or_404(Category, id=kwargs['category_id'])
# 分类不是全部,得到这个分类对应的所有编程语言
code_list = category.codes.values('id', 'name')
# 筛选这一分类
filter_dict['category'] = category
else:
# 如果编程语言不为0,则获取对应的编程语言
code = get_object_or_404(Code, id=kwargs['code_id'])
# 得到编程语言对应的所有分类
categories = code.category.all()
category_list = categories.values('id', 'name')
# 筛选课程在这些分类的结果
filter_dict['category__in'] = categories
if kwargs['category_id'] != '0':
# 如果分类不为0,对分类进行筛选,得到该编程语言和该分类下的结果
category = get_object_or_404(categories, id=kwargs['category_id'])
code_list = category.codes.values('id', 'name')
filter_dict['category'] = category
if kwargs['level_id'] != '0':
filter_dict['level'] = int(kwargs['level_id'])
filter_dict['status'] = 1
course_list = Course.objects.filter(**filter_dict)
return render(request, 'course.html',
{
'category_list': category_list,
'code_list': code_list,
'level_list': level_list,
'course_list': course_list,
})
模板
<!DOCTYPE html>
{% load course_active %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>多条件筛选多对多模型</title>
</head>
<body>
<h3>选择:</h3>
<p>
编程语言:
{% active_all request.path 1 %}
{% for code in code_list %}
<!--{{ code }}-->
{% active request.path code 1 %}
{% endfor %}
</p>
<p>
课程分类:
{% active_all request.path 2 %}
{% for category in category_list %}
<!--{{ category }}-->
{% active request.path category 2 %}
{% endfor %}
</p>
<p>
课程信息:
{% active_all request.path 3 %}
{% for level in level_list %}
<!--{{ level }}-->
{% active request.path level 3 %}
{% endfor %}
</p>
<h3>视频:</h3>
{% for course in course_list %}
<a class="item" href="{{ course.video.url }}">
<img src="/media/{{ course.image }}" width="300px" height="200px">
<p>《{{ course.title }}》{{ course.summary }}</p>
<hr>
</a>
{% endfor %}
</body>
</html>
链接生成模板标签
应用下创建templatetags包,创建 course_active.py 文件,用来放置模板标签
from django.utils.safestring import mark_safe
from django import template
register = template.Library()
@register.simple_tag
def active_all(current_url, index):
"""
获取当前url, course-1-1-2.html
:param current_url:
:param index:
:return:
"""
url_part_list = current_url.split('-')
if index == 3:
if url_part_list[index] == '0.html':
temp = '<a href="%s" class="active">【全部】</a>'
else:
temp = '<a href="%s"">全部</a>'
url_part_list[index] = '0.html'
else:
if url_part_list[index] == '0':
temp = '<a href="%s" class="active">【全部】</a>'
else:
temp = '<a href="%s"">全部</a>'
url_part_list[index] = '0'
url_str = '-'.join(url_part_list)
temp = temp % (url_str, )
return mark_safe(temp)
@register.simple_tag
def active(current_url, item, index):
"""
course-0-0-1.html
:param current_url:
:param item:
:param index:
:return:
"""
# print('\n当前访问地址:', current_url, item, index, type(index))
url_part_list = current_url.split('-')
# print(url_part_list) # ['/test/course', '0', '0', '0.html']
if index == 3:
if str(item['id']) == url_part_list[3].split('.')[0]: # 如果当前标签被选中
temp = '<a href="%s" class="active">【%s】</a>'
else:
temp = '<a href="%s"">%s</a>'
url_part_list[index] = str(item['id']) + '.html' # 拼接对应位置的url
else:
if str(item['id']) == url_part_list[index]:
temp = '<a href="%s" class="active">【%s】</a>'
else:
temp = '<a href="%s">%s</a>'
url_part_list[index] = str(item['id'])
url_str = '-'.join(url_part_list) # 拼接整体url
# print(url_str)
temp
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式