个人博客,欢迎查看: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
动态菜单显示
- 获取到登陆的用户User
- 通过User反查到UserProfile(一对一关系)
- 通过UserProfile找到该用户相关的角色
- 最后通过角色遍历出用户所有的菜单
遍历菜单列表
修改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 %}
获取
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 %}
获取链接
绝对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
网友评论