权限分配之用户管理
Posted I Do What I Do.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了权限分配之用户管理相关的知识,希望对你有一定的参考价值。
用户管理示例图:
第一步:路由的创建
rbac/urls.py
from django.urls import re_path from rbac.views import role from rbac.views import user urlpatterns = [ # 角色管理 re_path(r\'^role/list/$\', role.role_list, name="role_list"), re_path(r\'^role/add/$\', role.role_add, name="role_add"), re_path(r\'^role/edit/(?P<pk>\\d+)/$\', role.role_edit, name="role_edit"), re_path(r\'^role/del/(?P<pk>\\d+)/$\', role.role_del, name="role_del"), # 用户管理 re_path(r\'^user/list/$\', user.user_list, name="user_list"), re_path(r\'^user/add/$\', user.user_add, name="user_add"), re_path(r\'^user/edit/(?P<pk>\\d+)/$\', user.user_edit, name="user_edit"), re_path(r\'^user/del/(?P<pk>\\d+)/$\', user.user_del, name="user_del"), re_path(r\'^user/reset/password/(?P<pk>\\d+)/$\', user.user_reset_pwd, name="user_reset_pwd"), ]
第二步:ModelForm的书写
rbac/forms/user.py
from django import forms from rbac import models from django.core.exceptions import ValidationError class UserModelForm(forms.ModelForm): """添加用户""" confirm_password = forms.CharField( label="确认密码", ) # model中没有的字段,可自行添加一个该字段 class Meta: model = models.Userinfo # 关联的表 fields = ["name", "email", "password", "confirm_password"] # 字段 # 错误提示改为中文的第一种方法 # error_messages = # "name": "required": "用户名不能为空", # "email": "required": "邮箱不能为空", # "password": "required": "密码不能为空", # "confirm_password": "required": "确认密码不能为空", # 无效 # # 错误提示改为中文的第二种方法(在settings.py中把LANGUAGE_CODE进行修改) # LANGUAGE_CODE = \'zh-hans\' def __init__(self, *args, **kwargs): """为所有字段添加样式""" super(UserModelForm, self).__init__(*args, **kwargs) for name, field in self.fields.items(): # name就是上面fields中的字段 field.widget.attrs["class"] = "form-control" def clean_confirm_password(self): """局部钩子函数,校验两次密码是否一致""" password = self.cleaned_data.get("password") confirm_password = self.cleaned_data.get("confirm_password") if password != confirm_password: raise ValidationError("两次密码输入不一致...") return confirm_password class UpdateUserModelForm(forms.ModelForm): """编辑用户""" class Meta: model = models.Userinfo fields = ["name", "email"] def __init__(self, *args, **kwargs): super(UpdateUserModelForm, self).__init__(*args, **kwargs) for name, field in self.fields.items(): field.widget.attrs["class"] = "form-control" class ResetPasswordUserModelForm(forms.ModelForm): """重置密码""" confirm_password = forms.CharField( label="确认密码", ) class Meta: model = models.Userinfo fields = ["password", "confirm_password"] def __init__(self, *args, **kwargs): super(ResetPasswordUserModelForm, self).__init__(*args, **kwargs) for name, field in self.fields.items(): field.widget.attrs["class"] = "form-control" def clean_confirm_password(self): password = self.cleaned_data.get("password") confirm_password = self.cleaned_data.get("confirm_password") if password != confirm_password: raise ValidationError("两次密码输入不一致...") return confirm_password
第三步:视图函数的书写
rbac/views/user.py
"""角色管理""" from rbac import models from django.shortcuts import render, redirect, HttpResponse from django.urls import reverse from rbac.forms.user import UserModelForm, UpdateUserModelForm, ResetPasswordUserModelForm def user_list(request): """ 用户列表 :param request: :return: """ user_queryset = models.Userinfo.objects.all().order_by("pk") return render(request, "rbac/user_list.html", "users": user_queryset) def user_add(request): """ 添加用户 :param request: :return: """ if request.method == "GET": form = UserModelForm() return render(request, "rbac/change.html", "form": form) form = UserModelForm(data=request.POST) # 保存 if form.is_valid(): form.save() return redirect(reverse("rbac:user_list")) return render(request, "rbac/change.html", "form": form) def user_edit(request, pk): """ 用户编辑 :param request: :param pk: 要修改的用户ID :return: """ obj = models.Userinfo.objects.filter(id=pk).first() if not obj: return HttpResponse("用户不存在...") if request.method == "GET": form = UpdateUserModelForm(instance=obj) # 将原有的数据展示 return render(request, "rbac/change.html", "form": form) form = UpdateUserModelForm(instance=obj, data=request.POST) # 保存编辑后的数据 if form.is_valid(): form.save() return redirect(reverse("rbac:user_list")) return render(request, "rbac/change.html", "form": form) def user_del(request, pk): """ 删除用户 :param request: :param pk: :return: """ origin_url = reverse("rbac:user_list") if request.method == "GET": return render(request, "rbac/delete.html", "cancel_url": origin_url) models.Userinfo.objects.filter(id=pk).delete() return redirect(origin_url) def user_reset_pwd(request, pk): """ 重置密码 :param request: :param pk: :return: """ obj = models.Userinfo.objects.filter(id=pk).first() if not obj: return HttpResponse("用户不存在...") if request.method == "GET": form = ResetPasswordUserModelForm() # 重置密码,不需要把之前的密码进行展示 return render(request, "rbac/change.html", "form": form) form = ResetPasswordUserModelForm(instance=obj, data=request.POST) # 保存编辑后的数据 if form.is_valid(): form.save() return redirect(reverse("rbac:user_list")) return render(request, "rbac/change.html", "form": form)
第四步:模板的创建(change.html和delete.html都是共用的,所以只需要创建一个展示用户的html即可)
rbac/templates/rbac/user_list.html
% 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:user_add\' %"> <i class="fa fa-plus-square" aria-hidden="true"></i> 添加用户 </a> </div> <table class="table table-bordered table-hover"> <thead> <tr> <th>序号</th> <th>用户名</th> <th>邮箱</th> <th>重置密码</th> <th>操作</th> </tr> </thead> <tbody> % for row in users % <tr> <td> forloop.counter </td> <td> row.name </td> <td> row.email </td> <td> <a href="% url \'rbac:user_reset_pwd\' pk=row.id %">重置密码</a> </td> <td> <a style="color: #333333;" href="% url \'rbac:user_edit\' pk=row.id %"> <i class="fa fa-edit" aria-hidden="true"></i></a> <a style="color: #d9534f;" href="% url \'rbac:user_del\' pk=row.id %"> <i class="fa fa-trash-o"></i> </a> </td> </tr> % endfor % </tbody> </table> </div> % endblock %
知识点:
- ModelForm
- 字段的自定制
- 钩子函数
- 错误提示变成中文的两种方法
- 重写__init__方法,统一给所有字段添加属性("form-control")
- 根据namespace和name反向生成URL
- 模板的查找顺序
while True:
print(\'studying...\')
以上是关于权限分配之用户管理的主要内容,如果未能解决你的问题,请参考以下文章