權限分配之二級菜單增刪改查

先來看一看個人,數據庫的表:
權限表:Permission
html

一級菜單表: Menu前端

再看看,二級菜單的, 頁面效果圖:
python

分析一波:
  1. 二級菜單是創建在一級菜單的基礎上,進行展現。  這就又使用到,如何保留原搜索信息的方法,  關於攜帶參數的問題?
  2. 而後 二級菜單不須要單獨的, 展現頁面, 與 一級菜單使用同一個就能夠。
  3. 新建時二級菜單時,須要明確的知道,我這個二級菜單 是 屬於哪個 一級菜單。 因此在進入 二級菜單添加頁面時, 須要的參數又有一個 Menu_id 一級菜單的id數據庫

OK  話很少說:上代碼:
先看一看url 路由的設置:ide

    re_path(r"^second/menu/add/(?P<menu_id>\d+)/$", menu.second_menu_add, name="second_menu_add"),
    re_path(r"^second/menu/edit/(?P<pk>\d+)/$", menu.second_menu_edit, name="second_menu_edit"),
    re_path(r"^second/menu/del/(?P<pk>\d+)/$", menu.second_menu_del, name="second_menu_del"),

 由於展現頁面的 url 使用的仍是, 一級菜單的路由。因此來看一看對, 一級菜單路由的  一點改動:函數

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()
    if menu_id:
        second_menus = models.Permission.objects.filter(menu_id=menu_id)
    else:
        second_menus = []
    return render(request, "rbac/menu_list.html", locals())

 二級菜單,多了一個須要傳遞的參數 sid。而且須要在Permission表中找到,屬於當前點擊的 一級菜單的 二級菜單(也就是 權限表中, menu_id有值的字段)
若是一級菜單也就是 GET 請求有把一級菜單的 id 發送過來, 那麼就是用戶在訪問二級菜單,須要查找出來。
若是沒有這個值, 那麼用戶就只是在訪問,一級菜單。 二級菜單列表, 就應該爲空。

url

看看 頁面模板的設計: 這裏纔是改動較大的地方:spa

<div class="col-md-4">
            <div class="panel panel-default">
                <!-- Default panel contents -->
                <div class="panel-heading"><i class="fa fa-binoculars" aria-hidden="true"></i> 二級菜單
                    {% if second_menus %}
                        <a href="{% memory_url request 'rbac:second_menu_add' menu_id=menu_id  %}" 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 menu in second_menus %}
                        <tr class="{% if second_menu_id == menu.pk|safe %}active{% endif %}">
                            <th rowspan="2"><a href="?mid={{ menu_id }}&sid={{ menu.pk }}">{{ menu.title }}</a></th>
                            <td>{{ menu.name }}</td>
                            <td>
                                <a style="color: #333333;" href="{% memory_url request 'rbac:second_menu_edit' pk=menu.pk %}">
                                    <i class="fa fa-edit" aria-hidden="true"></i></a>
                                <a style="color: #d9534f;" href="{% memory_url request 'rbac:second_menu_del' pk=menu.pk %}"><i
                                        class="fa fa-trash-o"></i></a>
                            </td>
                        </tr>
                        <tr class="{% if second_menu_id == menu.pk|safe %}active{% endif %}">
                            <td colspan="2" style=" border-top: 0">{{ menu.url }}</td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
二級菜單  同屬菜單展現頁面。  只展現二級菜單的東西。

和一級菜單,不一樣的地方:
  1. 二級菜單添加按鈕  的路由。由於須要的不單單是自身的地址  還須要加上,當天我要往 那個一級菜單添加的。這個一級菜單的id
  href="{% memory_url request 'rbac:second_menu_add' menu_id=menu_id %}"設計

二級菜單,添加的 視圖函數:code

def second_menu_add(request, menu_id):
    '''
    二級菜單添加視圖
    :param request:
    :param menu_id:  已經選中的一級菜單的id(用於設置默認值)
    :return:
    '''
    menu_obj = models.Menu.objects.filter(pk=menu_id).first()
    if request.method == "POST":
        forms = SecondMenuForm(request.POST)
        if forms.is_valid():
            forms.save()
            return redirect(memory_reverse(request, "rbac:menu_list"))
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = SecondMenuForm(initial={"menu": menu_obj})
    # 爲一級菜單menu字段, 添加默認值。
    return render(request, "rbac/change.html", {"forms": forms}er 
二級菜單 視圖函數:

由於添加的是二級 菜單。因此依然是 使用的form組件來完成這件事。

class SecondMenuForm(BootstrapModelForm):
    '''菜單form'''

    class Meta:
        model = models.Permission
        exclude = ["pid"]

    def __init__(self, *args, **kwargs):
        super(SecondMenuForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs["class"] = "form-control"
Permission 表中有5個字段, 分別是: title、 url、 name、 menu、 pid 。

title 是標題,是須要進行展現的。 url 是路由。 name 是別名, menu是屬於哪個一級菜單。 pid 是此條url 屬於那一條url 的子菜單(或着子權限)。好比: 添加客戶權限屬於客戶列表權限的子權限。  他不能屬於, 帳戶列表。
so  明白了,咱們須要添加時,須要添加4個字段。  pid 是不須要的。  因此使用exclude = ["pid"]  剔除掉這個字段。

而且,有一點。 menu這個字段,展現的時候是一個select, 須要有一個默認選擇的選項。 也就是我是點擊哪個一級菜單進來的。 這樣就能夠修改屬於哪個一級菜單:
視圖函數代碼:

def second_menu_add(request, menu_id):
    '''
    二級菜單添加視圖
    :param request:
    :param menu_id:  已經選中的一級菜單的id(用於設置默認值)
    :return:
    '''
    menu_obj = models.Menu.objects.filter(pk=menu_id).first()
    if request.method == "POST":
        forms = SecondMenuForm(request.POST)
        if forms.is_valid():
            forms.save()
            return redirect(memory_reverse(request, "rbac:menu_list"))
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = SecondMenuForm(initial={"menu": menu_obj})
    # 爲一級菜單menu字段, 添加默認值。
    return render(request, "rbac/change.html", {"forms": forms})

 這裏上文,提到的一級菜單menu_id 就使用到了。
最初展現的時候, 使用forms = SecondMenuForm(initial={"menu": menu_obj})  initial參數, 爲指定的menu字段添加上,須要默認展現的字段。
也就是 從數據庫中,取出  pk=menu_id 的 model對象。

剩下的, 編輯和刪除:也就是 同樣的代碼:
惟一須要知道的就是, 編輯和刪除, 就不須要menu_id 這個參數, 來進行默認的展現。
由於全部的數據,已經存入的數據庫裏。 直接從數據庫中,取出來在進行渲染就好。

def second_menu_edit(request, pk):
    '''

    :param request:
    :param pk: 當前要編輯的二級菜單, 爲何這了不須要menu_id 了呢? 由於數據庫已經作好了關聯,全部不須要了
    :return:
    '''
    permission_obj = models.Permission.objects.filter(pk=pk).first()
    if not permission_obj:
        return HttpResponse("菜單不存在")

    if request.method == "POST":
        forms = SecondMenuForm(instance=permission_obj, data=request.POST)
        if forms.is_valid():
            forms.save()
            return redirect(memory_reverse(request, "rbac:menu_list"))
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = SecondMenuForm(instance=permission_obj)  # 將查詢出來的對象交給form組件, 進行渲染。
    # instance 就是接收一個 從數據庫中,取出的模型表的這樣一個數據。

    # 這裏爲何返回的是,添加的頁面? 由於添加個編輯如出一轍, 只是input框中有數據而已。 而我如今的forms中已經有了數據
    return render(request, "rbac/change.html", {"forms": forms})
編輯
def second_menu_del(request, pk):
    '''
    刪除操做, 須要給與用戶提示。
    :param reuqest:
    :param pk:  要刪除的權限id
    :return:
    '''
    origin_url = memory_reverse(request, "rbac:menu_list")
    permission_queryset = models.Permission.objects.filter(pk=pk)
    if not permission_queryset:
        return HttpResponse("菜單不存在")
    if request.method == "POST":
        permission_queryset.delete()
        return redirect(origin_url)
    return render(request, "rbac/delete.html", {"cancel": origin_url})
刪除
相關文章
相關標籤/搜索