您现在的位置是: 网站首页 >Django >DjangoCRM客户关系管理 Django

【CRM客户关系管理】05.动态菜单生成,绝对URL和动态URL

admin2018年11月23日 21:26 Django | Html | JavaScript | Python 1096人已围观

DjangoCRM客户关系管理简介 使用Django2.1.3+Bootstrap实现CRM系统,仿照Django Admin重写后台 Github地址:https://github.com/xyliurui/DjangoCRM Django版本:2.1.3

# 动态菜单生成 ## 创建动态菜单模型 ### 动态菜单模型 销售,学生,讲师访问页面时。显示的应该是对应角色的菜单,所以需要动态生成菜单,下面设计动态菜单模型 ```python class Menu(models.Model): """动态菜单""" Url_Type_Choices = ( (0, '绝对URL'), (1, '动态URL') ) name = models.CharField(max_length=100, verbose_name='菜单名称') url_type = models.SmallIntegerField(choices=Url_Type_Choices, default=0, verbose_name='菜单类型') url = models.CharField(max_length=200, verbose_name='URL地址') class Meta: unique_together = ('name', 'url') verbose_name_plural = verbose_name = '动态菜单' def __str__(self): return self.name ``` ### 角色关联到菜单 角色和菜单是多对多的关系 ```python class Role(models.Model): """角色表""" name = models.CharField(max_length=50, unique=True, verbose_name='角色名称') menus = models.ManyToManyField(Menu, blank=True, verbose_name='动态菜单') # 一个角色可以访问多个菜单,一个菜单可以被多个角色访问 class Meta: verbose_name_plural = verbose_name = '角色' def __str__(self): return self.name ``` 完成后同步数据库 ```bat manage.py@DjangoCRM > makemigrations manage.py@DjangoCRM > migrate ``` ## 动态菜单显示 1. 获取到登陆的用户User 2. 通过User反查到UserProfile(一对一关系) 3. 通过UserProfile找到该用户相关的角色 4. 最后通过角色遍历出用户所有的菜单 ### 遍历菜单列表 修改base.html文件,遍历登录用户的菜单列表 ```html ul class="nav nav-sidebar"> <li class="active"><a href="#">激活的菜单</a></li> <li><a href="#">菜单</a></li> {# request.user.userprofile.role.select_related #} {% for role in request.user.userprofile.role.all %} {% for menu in role.menus.all %} <li><a href="{% if menu.url_type == 0 %}{{ menu.url }}{% else %}{% url menu.url %}{% endif %}">{{ menu.name }}</a></li> {% endfor %} {% endfor %} </ul> ``` 如果是静态url直接获取,动态url就`{% url menu.url %}`获取 `OneToOneField`和`ForeignKey`反向获取 - `OneToOneField`反向查,直接`request.user.userprofile`后面跟反向的表明(小写)就可以 - 如果是FK,直接`request.user.userprofile_set` 后面跟反向的表明(小写)+`_set` 就可以,或者定义了`elated_name='userprofile'`就可以用`request.user.userprofile`获取 - `request.user.userprofile.role.select_related`等价于`request.user.userprofile.role.all` ### 测试菜单显示 动态URL:要与`path`中URL的`name`一致,如果生命了`namespace`,需要使用`namespace:name`构造URL,然后就可以通过`{% url menu.url %}`获取链接 ![BLOG_20181123_213057_17](/media/blog/images/2018/11/BLOG_20181123_213057_17.png "博客图集BLOG_20181123_213057_17.png") 绝对URL:直接添加实际的URL地址即可 ![BLOG_20181123_213043_56](/media/blog/images/2018/11/BLOG_20181123_213043_56.png "博客图集BLOG_20181123_213043_56.png") 然后将这些URL关联到角色中 ![BLOG_20181123_213034_59](/media/blog/images/2018/11/BLOG_20181123_213034_59.png "博客图集BLOG_20181123_213034_59.png") 最后将用户添加到角色中 ![BLOG_20181123_213019_18](/media/blog/images/2018/11/BLOG_20181123_213019_18.png "博客图集BLOG_20181123_213019_18.png") ### 菜单选中激活 当用户选中该链接时,li呈现选中状态 ```html <ul class="nav nav-sidebar"> <li class="active"><a href="#">激活的菜单</a></li> <li><a href="#">菜单</a></li> {# request.user.userprofile.role.select_related #} {% for role in request.user.userprofile.role.all %} {% for menu in role.menus.all %} {% if menu.url_type == 0 %} <li {% if request.path == menu.url %} class="active" {% endif %}><a href="{{ menu.url }}">{{ menu.name }}</a></li> {% else %} {% url menu.url as menu_dynamic_url %} <li {% if request.path == menu_dynamic_url %} class="active" {% endif %}><a href="{{ menu_url }}">{{ menu.name }}</a></li> {% endif %} {% endfor %} {% endfor %} </ul> ``` 由于两个url指向同一个链接,所以都是激活状态 ![BLOG_20181123_213010_22](/media/blog/images/2018/11/BLOG_20181123_213010_22.png "博客图集BLOG_20181123_213010_22.png")

很赞哦! (0)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行2075天
  • 系统信息:Linux
  • 后台程序:Python: 3.8.10
  • 网站框架:Django: 3.2.6
  • 文章统计:256 篇
  • 文章评论:60 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 公众号:微信扫描二维码,关注我们
  • QQ群:QQ加群,下载网站的学习源码
返回
顶部
标题 换行 登录
网站