rbac集成 权限分配。之角色管理

权限分配功能拆分:
  a. 角色管理
  b. 用户管理
  c. 菜单和权限的管理

  d. 批量的权限操作
  e. 分配权限

先实现 角色管理: 无非也就是,增删改查:
  定义路由, 编写视图。

1.查看角色页面:role_list.html

主路由分发器,先进行分发。  就以 rbac 为开头的作为我们的,后台权限 分配页面的路由起始:

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^', include('web.urls')),
    re_path(r'^rbac/', include(("rbac.urls", "rbac"))),
]

 rbac 组件, 再进行路由分发:

urlpatterns = [
    re_path(r"^role/list/$", role.role_list, name="role_list"),
]

 为了 避免,路由太长书写, 过于麻烦。 为每一个路由, 命名别名。  使用 反向解析, 进行路由的配置。

视图函数的处理:
为了 避免与业务app的视图产生冲突,我将rbac 组件中原有的 views.py 删除, 创建一个 views 包。 包内分别 放置不同的视图模块。 角色管理, 用户管理 等,分别使用不同的模块,进行处理。
新建 role.py 处理,角色相关的,所有视图函数。

def role_list(request):
    '''
    角色列表的功能
    :param request:
    :return:
    '''
    role_queryset = models.Role.objects.all()
    return render(request, "rbac/role_list.html", locals())

 templates 也是, 为了避免与业务app 产生冲突。 同样的操作。 templates --> role --> ....html

rbac集成  权限分配。之角色管理
{% extends "layout.html" %}

{% block content %}
    <div class="luffy-container">
        <div class="btn-group" style="margin: 5px 0">
            <a class="btn btn-default" href="{% url "rbac:role_add" %}">
                <i class="fa fa-plus-square" aria-hidden="true"></i> 添加角色
            </a>
        </div>
        <table class="table table-bordered table-hover">
            <thead>
            <tr>
                <th>ID</th>
                <th>名称</th>
                <th>选项</th>
            </tr>
            </thead>
            <tbody>
            {% for role in role_queryset %}
                <tr>
                    <td>{{ role.id }}</td>
                    <td>{{ role.title }}</td>
                    <td>
                        <a style="color: #333333;" href="/">
                            <i class="fa fa-edit" aria-hidden="true"></i></a>
                        <a style="color: #d9534f;" href="/"><i
                                class="fa fa-trash-o"></i></a>
                    </td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
    </div>
{% endblock %}
rbac\templates\rbac\role_list.html

模板中的所有 按钮的, href 属性。 全部使用,反向解析。来做:

href="{% url "rbac:role_add" %}"   不要忘了, 我们是通过 一级路由分发过来的, 所以要加上 rbac 名称空间的名字。

2. 添加角色页面:role_add.html

添加角色,与 查看相差无几。 唯一不同, 我使用,forms 组件, 进行验证,用户输入是否合法。
从url 开始:

urlpatterns = [
    re_path(r"^role/list/$", role.role_list, name="role_list"),
    re_path(r"^role/add/$", role.role_add, name="role_add"),
]

forms组件,单独创建包,进行存放:

因为我们是,直接对数据库,进行修改。 所以使用 class Meta: 进行确定。 我们要渲染的和要保存的 是那一张表。
我这里只有一个title字段, 另一个是一个外键关系。 添加权限才用得到。

rbac集成  权限分配。之角色管理
from django import forms
from django.core.exceptions import ValidationError,NON_FIELD_ERRORS
from rbac import models


class RolemodelForm(forms.ModelForm):
    '''
    角色 添加, fomr 组件
    '''

    class Meta:
        model = models.Role
        fields = ["title"]  # fields = "__all__"  就表示 对表中所有字段进行,操作
        # 直接指定,数据库中的 Role 角色表。  只对他的title 字段, 进行操作。
        widgets = {"title": forms.TextInput(attrs={"class": "form-control"})}
        # 为 input 框, 添加样式, 利用widgets小工具
rbac\My_forms\My_forms.py

视图函数:

rbac集成  权限分配。之角色管理
def role_add(request):
    '''
    添加角色的功能
    :param request:
    :return:
    '''
    forms = My_forms.RolemodelForm()
    if request.method == "POST":
        forms = My_forms.RolemodelForm(request.POST)
        if forms.is_valid():  # 验证成功
            forms.save()  # 进行保存
            return redirect(reverse("rbac:role_list"))  # 跳转到role_list
        else:
            return render(request, "rbac/role_add.html", {"forms": forms})  # 验证失败,返回带有错误信息的页面
    return render(request, "rbac/role_add.html", {"forms": forms})
rbac\views\role.py   role_add(request):

模板文件:

rbac集成  权限分配。之角色管理
{% extends "layout.html" %}

{% block content %}
    <div class="luffy-container">
        <form class="form-horizontal" method="post" novalidate>
            {% csrf_token %}
            {% for field in forms %}
                <div class="form-group">
                    <label class="col-sm-2" contorl-lable>{{ field.label }}</label>
                    <div class="col-sm-8">
                        {{ field }} <span style="color: red">{{ field.errors.0 }}</span>
                    </div>
                </div>
            {% endfor %}
            <div class="form-group">
                <div class="col-sm-8 col-sm-offset-2">
                    <input type="submit" value="保存" class="btn btn-primary">
                </div>
            </div>
        </form>
    </div>
{% endblock %}
\rbac\templates\rbac\role_add.html

使用forms 组件,进行渲染吗, 比较方便。 样式什么的自己挑。 使用post 发送添加数据的请求。

这样, 当我们添加数据时, 通过验证之后, 就会自动保存到数据库中,  forms.save()  就能完成这件事。

 

3. 编辑角色页面, role_edit.html

 

上一篇:php – Yii Framework 2.0基于角色的访问控制RBAC


下一篇:rbac集成 权限分配。之用户管理