zoukankan      html  css  js  c++  java
  • 权限分配之权限的展示

    最后就是权限的展示了:
    对前面的 总结:
      1. 一级菜单列表,是我对 menu表的,增删改查。
      2. 二级菜单列表,是我对Permission表中, 可以作为二级菜单存在,如 客户列表、账单列表的 增删改查
      3. 最后的权限展示,就是对Permission表中, 不能作为二级菜单, 但是他的pid字段,关联着 二级菜单权限的,例如 添加客户,编辑,删除客户这些权限的增删改查。

    查:
    对于查,好说。 差的内容就是, 基于二级菜单的 id 进行查找, 并且展示:
    并且 这个 id 前面已经做过解释。 就是 get 请求 ?之后携带的数据。  sid=1 就是要查找的。 permission表中 pid字段与这个参数, 相等的,那些权限信息。

    def menu_list(request):
        '''
        菜单和权限列表
        :param request:
        :return:
        '''
        # menu_id = int(request.GET.get("mid"))  # 前端判断时,需要一个int类型,而不是str类型。
        menu_id = request.GET.get("mid")  # 或者在前端进行转换,将数字转换成,字符串
        second_menu_id = request.GET.get("sid")
    
        menu_list = models.Menu.objects.all()
        try:
            if menu_id:
                second_menus = models.Permission.objects.filter(menu_id=menu_id)
            else:
                second_menus = []
    
            if second_menu_id:
                permissions = models.Permission.objects.filter(pid=second_menu_id)
            else:
                permissions = []
            return render(request, "rbac/menu_list.html", locals())
        except ValueError as e:
            return HttpResponse("查找不存在")
    

     permissions 就是查询出来的结果。
    为了防止,可能输入的不是。 数字格式,我做个 异常捕捉。 可以直接返回个404 也没问题。
    然后看一下,三级菜单的。html代码:

    <div class="col-md-5">
                <div class="panel panel-default">
                    <!-- Default panel contents -->
                    <div class="panel-heading"><i class="fa fa-binoculars" aria-hidden="true"></i> 权限菜单
                        {% if permissions and second_menus %}
                            <a href=""
                               class="right btn btn-success btn-xs"
                               style="padding: 2px 8px;margin: -3px;">
                                <i class="fa fa-plus-circle" aria-hidden="true"></i>
                                新建
                            </a>
                        {% endif %}
                    </div>
                    <!-- Table -->
                    <table class="table">
                        <thead>
                        <tr>
                            <th>名称</th>
                            <th>URL & CODE</th>
                            <th>选项</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for permission in permissions %}
                            <tr class="">
                                <th rowspan="2">{{ permission.title }}</th>
                                <td>{{ permission.name }}</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>
                            <tr class="">
                                <td colspan="2" style=" border-top: 0">{{ permission.url }}</td>
                            </tr>
                        {% endfor %}
                        </tbody>
                    </table>
                </div>
            </div>
    View Code

    只是展示, 连接的url, 下面写。

    ok 再来想一想:
      是不是需要,让权限进行添加的时候, 也可以选择要往哪一个, 二级菜单下添加权限。 要的话就按照二级菜单新建的步骤,再来一遍就好。
      so  这次就,让这个权限, 默认就创建在,当前点击的这个二级菜单之下。 就不让用户进行选择了。  毕竟一般也用不到。
    所以form要渲染的时候,就只剩下 三个字段  title  name  url

    class PermissionForm(BootstrapModelForm):
        class Meta:
            model = models.Permission
            fields = ["title", "name", "url"]
    

     BootstrapModelForm 是一个基类, 用以初始化 标签的样式:

    class BootstrapModelForm(forms.ModelForm):
        '''
        因为,太多的地方需要使用, __init__ 初始化方式。来对每个标签添加 class="form-control" 所以搞个基类让
        要进行, 这部操作的 类去继承,
        '''
        def __init__(self, *args, **kwargs):
            super(BootstrapModelForm, self).__init__(*args, **kwargs)
            for name, field in self.fields.items():
                field.widget.attrs["class"] = "form-control"
    

     然后在 添加的视图中, 对于form.save() 之前, 需要将 pid 字段添加到 form中。然后才进行保存。 毕竟用户是没有输入这个字段的。

    def permission_add(request, second_menu_id):
        '''
        添加权限
        :param request:
        :param menu_id:  已经选中的二级菜单的id(用于设置默认值)
        :return:
        '''
        if request.method == "POST":
            forms = PermissionForm(request.POST)
            if forms.is_valid():
                # 在添加页面,用户只输入了三个值 title url name 还需要一个 pid的值。 就是传递过来的second_menu_id
                # 并且传递过来的值,可以在数据库中找到对应的 记录,才行。 而且要在forms.save() 保存之前,加入到form中
                second_menu_obj = models.Permission.objects.filter(pk=second_menu_id).first()
                if not second_menu_obj:
                    return HttpResponse("二级菜单存在,请重新选择")
                # forms.instance 中包含了用户提交的所有值。 他就是一个Permission对象:
                # instance = models.Permission(title="", name="", url="")  # 接收用户发来的数据
                # instance.pid = second_menu_obj 然后赋值时,就相当于pid = second_menu_obj。 orm操作,外键可以直接指定一个model对象
                # instance.save 然后保存整个内容。 这也是 forms.save 内部做的事情
                forms.instance.pid = second_menu_obj
                forms.save()
                return redirect(memory_reverse(request, "rbac:menu_list"))
            else:
                return render(request, "rbac/change.html", {"forms": forms})
        forms = PermissionForm()
        # 为一级菜单menu字段, 添加默认值。
        return render(request, "rbac/change.html", {"forms": forms})
    添加权限的 视图函数:

    已经有了, 是点击哪一个 二级菜单过来的记录   second_menu_id
    所以先进行,验证一下。  看一下在数据库中是否有这个 主键 id=second_menu_id  的记录存在。
    然后将这条记录, 交给 pid 。 做一个关联。   orm 是支持在关联时,直接使用一个model对象对字段进行赋值的。

    forms.instance 中包含了用户提交的所有值。 他就是一个Permission对象:
      instance = models.Permission(title="", name="", url="")  # 接收用户发来的数据
      instance.pid = second_menu_obj 然后赋值时,就相当于pid = second_menu_obj。 orm操作,外键可以直接指定一个model对象
      instance.save 然后保存整个内容。 这也是 forms.save 内部做的事情


    forms.instance.pid = second_menu_obj  直接为pid 进行赋值。 然后form.save  保存到数据库

  • 相关阅读:
    将HTML格式的String转化为HTMLElement
    程序执行效率
    Oracle之sql追踪
    单行bash、shell、perl命令
    主机安装
    时间序列分析
    R统计图
    需求分析
    oracle数据导入导出
    linux权限问题
  • 原文地址:https://www.cnblogs.com/chengege/p/10712825.html
Copyright © 2011-2022 走看看