day12 权限分配之用户管理

用户管理思路

项目目录

应用路由设置

rbac/urls.py

#! -*- coding:utf-8 -*-
from django.urls import path, re_path
from rbac.views import role, user

app_name='rbac'
urlpatterns = [
    path(r"role/list/", role.role_list, name="role_list"),
    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"),

    path(r"user/list/", user.user_list, name="user_list"),
    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"),


]

forms组件代码编写
rbac/forms/user.py

# -*- encoding: utf-8 -*-
"""
@File    : user.py
@Time    : 2021-12-26 12:59
@Author  : tangsai
@Email   : 294168604@qq.com
@Software: PyCharm
"""

from django import forms
from django.core.exceptions import ValidationError
from rbac import models


class UserModelForm(forms.ModelForm):
    # 添加额外字段
    confirm_password = forms.CharField(label="确认密码")

    class Meta:
        model = models.UserInfo
        fields = ["name", "email", "password", "confirm_password"]
        # 在settings.py中设置LANGUAGE_CODE = 'zh-hans',即可自动将错误提示转为中文
        # error_messages = {
        #     'name':{'required':'用户名不能为空!'},
        #     'email':{'required':'邮箱不能为空!'},
        #     'password':{'required':'密码不能为空!'},
        # }

    # 循环为每一个字段添加样式
    def __init__(self, *args, **kwargs):
        super(UserModelForm, 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["password"]
        confirm_password = self.cleaned_data["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 ResetPasswordModelForm(forms.ModelForm):
    confirm_password = forms.CharField(label='确认密码')

    class Meta:
        model = models.UserInfo
        fields = ['password', 'confirm_password']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        for name, field in self.fields.items():
            field.widget.attrs['class'] = 'form-control'

    def clean_confirm_pwd(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if password and confirm_password:
            if password == confirm_password:
                return self.cleaned_data
            raise ValidationError('两次密码不一致!')
        else:
            return self.cleaned_data

用户管理后端代码编写
rbac/views/user.py

# -*- encoding: utf-8 -*-
"""
@File    : user.py
@Time    : 2021-12-26 12:58
@Author  : tangsai
@Email   : 294168604@qq.com
@Software: PyCharm
"""

from django.shortcuts import render, redirect, HttpResponse
from django.urls import reverse
from django import forms
from django.forms.widgets import TextInput

from rbac import models
from rbac.forms.user import UserModelForm, UpdateUserModelForm, ResetPasswordModelForm


def user_list(request):
    user_queryset = models.UserInfo.objects.all()
    return render(request, 'rbac/user_list.html', {"users": user_queryset})


def user_add(request):
    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):
    user_obj = models.UserInfo.objects.filter(pk=pk).first()
    if not user_obj:
        return HttpResponse('用户不存在')

    if request.method == 'POST':
        form = UpdateUserModelForm(data=request.POST, instance=user_obj)
        if form.is_valid():
            form.save()
            return redirect(reverse('rbac:user_list'))
        return render(request, 'rbac/change.html', {"form": form})
    form = UpdateUserModelForm(instance=user_obj)  # GET 请求instance 携带默认的值
    return render(request, 'rbac/change.html', {"form": form})


def user_del(request, pk):
    # 很多页面都会有取消的跳转,起一个共有的名字,传给模板,这样模板中每次用同一个名字即可返回各自的起始页面
    cancel_url = reverse('rbac:user_list')
    user_queryset = models.UserInfo.objects.filter(pk=pk)
    if not user_queryset:
        return HttpResponse('角色不存在!')

    if request.method == 'POST':
        user_queryset.delete()
        return redirect(cancel_url)

    return render(request, 'rbac/delete.html', locals())


def user_reset_pwd(request, pk):
    user_obj = models.UserInfo.objects.filter(pk=pk).first()
    if not user_obj:
        return HttpResponse('角色不存在')

    if request.method == 'POST':
        form = ResetPasswordModelForm(request.POST, instance=user_obj)
        if form.is_valid():
            form.save()
            return redirect(reverse('rbac:user_list'))
        return render(request, 'rbac/change.html',  {"form": form})

    form = ResetPasswordModelForm()
    return render(request, 'rbac/change.html',  {"form": form})

前端模板设置
用户列表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 href="{% url 'rbac:user_edit' pk=row.id %}" class="fa fa-edit" style="color: deepskyblue;"></a>
                        |
                        <a href="{% url 'rbac:user_del' pk=row.id %}" class="fa fa-trash-o red" style="color: red"></a>
                    </td>


                </tr>
            {% endfor %}
            </tbody>
        </table>
    </div>
{% endblock %}
posted @ 2021-12-26 11:06  simon_T  阅读(45)  评论(0编辑  收藏  举报