知乎 - 知乎Django實戰1-許可權管理功能實現-09:組織架構關聯用戶來自專欄 SandBox4 人贊了文章實現組織架構和用戶綁定,..." />

Django實戰1-許可權管理功能實現-09:組織架構關聯用戶

tml lang="zh" data-theme="light">知乎 - 知乎

Django實戰1-許可權管理功能實現-09:組織架構關聯用戶

來自專欄 SandBox4 人贊了文章

實現組織架構和用戶綁定,通過綁定按鈕設置組織架構和用戶之間一對多的關聯關係。

1 關聯用戶

1.1 關聯用戶的視圖實現

打開sandboxMP/apps/system/views_structure.py,添加如下內容:

from django.contrib.auth import get_user_model
User = get_user_model()

class Structure2UserView(LoginRequiredMixin, View):

def get(self, request):
if id in request.GET and request.GET[id]:
# 通過id獲取需要綁定用戶的組織架構實例
structure = get_object_or_404(Structure, pk=int(request.GET[id]))
# 通過外鍵的反向查找(_set),找到已經綁定到該組織架構的所有用戶信息
added_users = structure.userprofile_set.all()
# 查找系統中所有用戶信息,User = get_user_object()使用自定義用戶模型都是通過這種模式
all_users = User.objects.all()
# 通集合獲取差集set().difference(),得出還未綁定的用戶
un_add_users = set(all_users).difference(added_users)
# 將這些數據返回給前端,用來渲染數據,形成一個複選框,左邊是未綁定用戶,右邊是已經綁定的用戶
ret = dict(structure=structure, added_users=added_users, un_add_users=list(un_add_users))
return render(request, system/structure/structure_user.html, ret)

def post(self, request):
res = dict(result=False)
id_list = None
# 通過id獲取structure實列
structure = get_object_or_404(Structure, pk=int(request.POST[id]))
# 獲取需要綁定到structure實例的用戶id
if to in request.POST and request.POST.getlist(to, []):
id_list = map(int, request.POST.getlist(to, []))
# 清空組織架構原有用戶綁定信息
structure.userprofile_set.clear()
if id_list:
# 綁定新的用戶數據
for user in User.objects.filter(id__in=id_list):
structure.userprofile_set.add(user)
res[result] = True
return HttpResponse(json.dumps(res), content_type=application/json)

視圖實現思路:參照代碼中的注釋。

1.2 關聯用戶URL配置

打開sandboxMP/apps/system/urls.py, 新增URL配置:

urlpatterns = [
原有內容省略
path(basic/structure/add_user/, views_structure.Structure2UserView.as_view(), name=basic-structure-add_user),
]

1.3 新增用戶關聯的模板頁

新建sandboxMP/templates/system/structure/structure_user.html,內容如下:

{% extends base-layer.html %}
{% load staticfiles %}

{% block css %}
<link rel="stylesheet" href="{% static plugins/select2/select2.min.css %}">
{% endblock %}
{% block main %}
<div class="box box-danger">
<form class="form-horizontal" id="selectUsersForm" action="" method="post">
{% csrf_token %}
<input type="hidden" name=id value="{{ structure.id }}"/>
<div class="box-body">
<div class="row">
<div class="col-xs-5">
<label class="control-label">可選用戶:</label>
<select name="from" id="multiselect" class="form-control" size="18" multiple="multiple">
{% for item in un_add_users %}
<option value="{{ item.id }}">{{ item.name }}({{ item.username }})</option>
{% endfor %}
</select>
</div>
<div class="col-xs-2">
<br><br><br><br><br><br>
<button type="button" id="multiselect_rightAll" class="btn btn-block"><i
class="glyphicon glyphicon-forward"></i></button>
<button type="button" id="multiselect_rightSelected" class="btn btn-block"><i
class="glyphicon glyphicon-chevron-right"></i></button>
<button type="button" id="multiselect_leftSelected" class="btn btn-block"><i
class="glyphicon glyphicon-chevron-left"></i></button>
<button type="button" id="multiselect_leftAll" class="btn btn-block"><i
class="glyphicon glyphicon-backward"></i></button>
</div>
<div class="col-xs-5">
<label class="control-label">編輯:{{structure.name}}-已綁定用戶:</label>
<select name="to" id="multiselect_to" class="form-control" size="18" multiple="multiple">
{% for item in added_users %}
<option value="{{ item.id }}">{{ item.name }}({{ item.username }})</option>
{% endfor %}
</select>
</div>
</div>
<div class="row">
<div class="col-xs-12 margin-top-5">
<p class="text-maroon">*注意:一個用戶只能隸屬一個部門,如果選擇的用戶已存在部門,用戶將會從原有部門移出</p>
</div>
</div>
</div>
<div class="box-footer ">
<div class="row span7 text-center ">
<button type="button" id="btnCancel" class="btn btn-default margin-right ">重置</button>
<button type="button" id="btnSave" class="btn btn-info margin-right ">保存</button>
</div>
</div>
</form>
</div>
{% endblock %}

{% block javascripts %}
<script src="{% static plugins/select/multiselect.min.js %}"></script>
<script type="text/javascript">
$(document).ready(function () {
//初始化多選列表
$(#multiselect).multiselect({
search: {
left: <input type="text" class="form-control" placeholder="Search..." />,
right: <input type="text" class="form-control" placeholder="Search..." />,
},
fireSearch: function (value) {
return value.length > 3;
}
});

});

$("#btnSave").click(function () {
$(#multiselect_to option).prop(selected, true);
var data = $("#selectUsersForm").serialize();
console.log(data);
$.ajax({
type: $("#selectUsersForm").attr(method),
url: "{% url system:basic-structure-add_user %}",
data: data,
cache: false,
success: function (msg) {
if (msg.result) {
layer.alert(操作成功, {icon: 1});
} else {
//alert(msg.message);
layer.alert(操作失敗, {icon: 2});
}
return;
}
});
});

/*點取消刷新新頁面*/
$("#btnCancel").click(function () {
window.location.reload();

});
</script>
{% endblock %}

組織架構關聯用戶模板頁使用了一個jQuery多選框組建:crlcu.github.io/multise, 具體用法可以參考官方網址,網址中也有使用案例,沒有太高要求的直接參考案例裡面的用法就可以了。

1.4 為關聯用戶的按鈕添加點擊事件

我們需要在組織架構管理頁面點擊關聯按鈕調用關聯彈窗,完成組織架構和用戶的綁定。 在sandboxMP/templates/system/structure/structure.html模板中{% block javascripts %} 標籤下添加如下內容:

//刪除單個數據
function doDelete(id) {
原有內容省略

}
//新增的關聯用戶,放到doDelete()函數後面
function doAddUser(id) {
layer.open({
type: 2,
title: 編輯:{{structure.name}},
shadeClose: false,
maxmin: true,
area: [800px, 600px],
content: ["{% url system:basic-structure-add_user %}" + ?id= + id, no],
end: function () {
window.location.reload();
}
});
}
//關聯用戶的函數到這裡就結束了
</script>

最終運行效果:

有關組織架構的完整操作到這裡就結束了,datatables初始化的時候已經啟用了搜索功能,組織架構沒有單獨配置查詢所有的功能,有興趣可以自行完成。

完成以上配置,訪問structure管理頁面,可以通過頭部複選框選中多條數據,然後點上面的刪除按鈕,進行批量刪除。點擊單條數據後面的刪除按鈕可以刪除單條記錄。

最新最全文檔,請關注我的知識星球: t.zsxq.com/a6IqBMr (微信中打開鏈接)

本節文檔對應源碼版本: github.com/RobbieHan/sa

非常歡迎感興趣的朋友,到我的Github或知乎上做客,閑暇之餘給個贊或Star,贈人玫瑰手留余香

文檔配套項目地址:github.com/RobbieHan/sa

知乎專欄SandBox:zhuanlan.zhihu.com/sand

輕量級辦公管理系統項目開源地址:github.com/RobbieHan/gi

推薦閱讀:

TAG:Django(框架) | Python | 開發文檔 |