>[success] # 多对多菜单互相影响
场景,当选着父级菜单,展示对应的自己菜单,两者互相关联的状态
![](https://box.kancloud.cn/876b2b2e10b0f17e0a32de819eba5ab8_481x128.png)
多级菜单的时候,主要二级菜单是被一级菜单影响,所以所有二级菜单显示情况根据一级菜单配合展示对应的数据情况
>[success] # 思路代码
~~~
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.当一级菜单不存在的时候,直接设置查询全部
~~~
>[danger] ##### 代码展示
~~~
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,
}
)
~~~
>[danger] ##### 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>
~~~
- 网络原理
- 为搭建框架做准备
- 简单认识网路
- 自定义模拟网站案例
- 优化最终框架
- 数据存储 -- data
- 用户个人信息存储 -- User.txt
- 路由映射 -- routes
- 处理用户信息 -- routes_static.py
- 保存静态文件 -- static
- templates -- html 集中处理模块
- 首页 -- index.html
- 登陆 -- login.html
- 用户注册页面 -- register
- 日志模块 -- log.gua.txt
- 启动文件--server.py
- orm处理 -- model.py
- 日志模块 -- utils.py
- 两种数据库类型
- 传统数据库了解篇
- 前端快速入门
- JS简单使用入门
- css简单快速入门
- DJANGO
- virtualenv-创建虚拟环境
- 项目结构
- django-admin中文配置
- django-打印sql语句
- django-基础
- 认识MVC和MTV
- Django--初识
- Django--初识案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-数据库配置
- ORM-model字段
- ORM-model字段解释
- ORM-字段选项
- ORM-查询
- ORM-四种常用查询方法
- ORM-三种获取数据
- ORM-其他查询方式
- ORM-条件查询双线
- ORM-Q和F条件使用
- ORM-三种数据库交互
- 案例 -- 一对多
- ORM-技巧/常见问题
- ORM-N+1 问题
- ORM-并发的处理
- ORM-数量查询、
- ORM-正向反向查询
- ORM-基础案例一
- ORM-基础一对多案例
- Django-templates
- Django-模板的继承
- Django-模板的过滤
- Django-自定义模板的过滤
- Django-cookie
- Django-cookies 装饰器
- Djang-session
- Django-CSRF
- Django-中间件 -- 后续了解
- Django- 缓存 -- 没有深入了解
- Django-form
- From-ajax
- form-内部验证处理
- form-属性
- form-常用的标签字段
- form-常用的下拉和选择
- form-widget速查
- Django-ajax序列化
- Django-多种ajax写法
- ajax-原生写法
- ajax-$写法
- ajax-ifram
- Django-ajax图片上传
- ajax-原始写法
- ajax-正常写法
- iframe+form
- 实战写法
- Django-常用自编写组件
- Django-双菜单组合搜索
- Django - 多菜单组合搜索
- Django-分页
- django-综合基础
- 综合基础-render
- django-admin
- admin-页面配置
- admin-字段配置
- admin-编辑页面
- admin-forms验证
- admin-创建抽象类
- django-验证码
- 验证码-第三方生成库
- 验证码-view.py使用
- 验证码-注意引入Monaco.ttf
- django-用户注册
- 注册-form 模块
- 注册-views 模块
- 注册-html模块
- 注册-model模块
- django-用户登录三种
- session登录
- form-session 写法
- view-写法
- Html-写法
- model-写法
- 继承类登录
- 外键关联登录
- django-简单的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和数据库关联的写法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系统
- APP目录-models.py 创建
- APP目录-基础展示数据分析
- APP目录-基础数据展示cls
- ListView
- DetailView
- FormView
- 额外功能拓建
- 添加文章搜索/用户文章查询功能
- 增加一个友情链接
- 增加一个评论模块
- App-利用Bootstrap4 搭建样式
- 项目crm
- 思维导图
- perfectCRM-项目名字
- settings.py-配置
- view.py-登陆/登出函数
- crm-app文件
- model.py-表的创建
- admin.py-注册后台
- view.py-视图层
- static-静态文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首页模板