美文网首页Python Web开发学习CRM客户关系管理
【CRM客户关系管理】05.动态菜单生成,绝对URL和动态URL

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

作者: 吾星喵 | 来源:发表于2018-11-23 21:31 被阅读0次

    个人博客,欢迎查看:https://blog.starmeow.cn/

    Github地址:https://github.com/xyliurui/DjangoCRM

    动态菜单生成

    创建动态菜单模型

    动态菜单模型

    销售,学生,讲师访问页面时。显示的应该是对应角色的菜单,所以需要动态生成菜单,下面设计动态菜单模型

    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
    

    角色关联到菜单

    角色和菜单是多对多的关系

    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
    

    完成后同步数据库

    manage.py@DjangoCRM > makemigrations
    manage.py@DjangoCRM > migrate
    

    动态菜单显示

    1. 获取到登陆的用户User
    2. 通过User反查到UserProfile(一对一关系)
    3. 通过UserProfile找到该用户相关的角色
    4. 最后通过角色遍历出用户所有的菜单

    遍历菜单列表

    修改base.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 %}获取

    OneToOneFieldForeignKey反向获取

    • 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 %}获取链接

    image.png

    绝对URL:直接添加实际的URL地址即可

    image.png

    然后将这些URL关联到角色中

    image.png

    最后将用户添加到角色中

    image.png

    菜单选中激活

    当用户选中该链接时,li呈现选中状态

    <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指向同一个链接,所以都是激活状态

    image.png

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/smpsqqtx.html