Django – 多菜单组合搜索
多对多菜单互相影响
场景,当选着父级菜单,展示对应的自己菜单,两者互相关联的状态
多级菜单的时候,主要二级菜单是被一级菜单影响,所以所有二级菜单显示情况根据一级菜单配合展示对应的数据情况
思路代码
1.当一级菜单选择全部的情况也就是0-0-0 或者0-1-0
1.1 当0-0-0的时候 展示二级菜单所有项目
1.2 当0-1-0的时候 也展示二级菜单所有项目,但要记录在查询数据库的集合条件中
2.当一级菜单的选择情况为1-0-0的时候,考虑二级菜单的情况,1-0-0/1-1-0/1-不存在-0
2.1 当二级菜单为0 也就是全部的时候,查询对应1级菜单中对应的所有二级菜单选项,用来展示在页面,查询二级菜单的所有id,用来配合查询内容展示
2.2 当二级菜单为指定的菜单时 也就是1-1-0,直接保存对应id
2.3 当二级菜单输入的id不存在的时候,直接设置二级菜单的默认值为全部
3.当一级菜单不存在的时候,直接设置查询全部
代码展示
def index(request,**kwargs):
concent = {}
for k,v in kwargs.items():
kwargs[k] = int(v)
work_id = kwargs['work_id']
language_id = kwargs['language_id']
# 第一种0-0-0
if work_id == 0:
obj_language = models.Language.objects.all()
# 第二种0-1-0
if language_id :
concent['language_id'] = language_id
# 第三种 1-0-0
else:
obj_work = models.Work.objects.filter(id=work_id).first()
if obj_work:
# 页面展示对应标签
obj_language = obj_work.language.all()
# 获取所有的对应标签id
v = obj_work.language.values_list('id')
if v:
language_list_id = list(zip(*v))[0]
else:
language_list_id = []
# 1-0-0 情况
if language_id == 0:
concent['language_id__in'] = language_list_id
else:
# 第四种 1-1-0情况
if language_id in language_list_id:
concent['language_id'] = language_id
# 第五种 1-1000-0 不存在的情况
else:
kwargs['language_id'] = 0
concent['language_id__in'] = language_list_id
else:
kwargs['language_id'] = 0
kwargs['work_id'] = 0
obj_language = models.Language.objects.all()
if kwargs['level_id']!=0:
concent['level_id'] = kwargs["level_id"]
obj_level = models.Level.objects.all()
obj_work = models.Work.objects.all()
content = models.Content.objects.filter(**concent)
return render(
request,
"index.html",
{
"obj_level":obj_level,
"obj_work": obj_work,
"content": content,
"kwargs": kwargs,
"obj_language":obj_language,
}
)
html展示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
a{
display: inline-block;
padding: 3px 5px;
border:1px solid #dddddd;
margin: 5px 5px;
}
a.active{
background-color:yellowgreen;
}
</style>
</head>
<body>
<div>
{% if kwargs.work_id == 0 %}
<a class="active" href="/index/0-{{kwargs.language_id}}-{{kwargs.level_id}}">全部</a>
{% else %}
<a href="/index/0-{{kwargs.language_id}}-{{kwargs.level_id}}">全部</a>
{% endif %}
{% for i in obj_work %}
{% if kwargs.work_id == i.id %}
<a class="active" href="/index/{{i.id}}-{{kwargs.language_id}}-{{kwargs.level_id}}" >{{ i.name }}</a>
{% else%}
<a href="/index/{{i.id}}-{{kwargs.language_id}}-{{kwargs.level_id}}" >{{ i.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kwargs.language_id == 0 %}
<a class="active" href="/index/{{kwargs.work_id}}-0-{{kwargs.level_id}}">全部</a>
{% else %}
<a href="/index/{{kwargs.work_id}}-0-{{kwargs.level_id}}">全部</a>
{% endif %}
{% for i in obj_language %}
{% if kwargs.language_id == i.id %}
<a class="active" href="/index/{{kwargs.work_id}}-{{i.id}}-{{kwargs.level_id}}" >{{ i.name }}</a>
{% else%}
<a href="/index/{{kwargs.work_id}}-{{i.id}}-{{kwargs.level_id}}" >{{ i.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kwargs.level_id == 0 %}
<a class="active" href="/index/{{kwargs.work_id}}-{{kwargs.language_id}}-0">全部</a>
{% else %}
<a href="/index/{{kwargs.work_id}}-{{kwargs.language_id}}-0">全部</a>
{% endif %}
{% for i in obj_level %}
{% if kwargs.level_id == i.id %}
<a class="active" href="/index/{{kwargs.work_id}}-{{kwargs.language_id}}-{{i.id}}">{{ i.name }}</a>
{% else%}
<a href="/index/{{kwargs.work_id}}-{{kwargs.language_id}}-{{i.id}}">{{ i.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
<h1>展示</h1>
{% for i in content %}
{{ i.title }}
{% endfor %}
</div>
</body>
</html>

