Python Web开发学习CRM客户关系管理

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

2018-11-23  本文已影响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反向获取

测试菜单显示

动态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
上一篇下一篇

猜你喜欢

热点阅读