>[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> ~~~