rbac集成 權限分配。之用戶管理

流程都是同樣的。就不在詳細的記錄。只寫一點須要注意的地方! 或者 能夠改進的地方!

1. 用戶表中 只有。 name  password email 三個字段。 可是添加用戶的頁面,應該還要有確認密碼的字段。
  因此,在UserInfoModelForm(forms.ModelForm):  中須要本身添加一個字段:
       confirm_password = forms.CharField(label="確認密碼")
2. 樣式問題,由於是基於bootstrap 因此會簡單不少。  添加class屬性的方法, 有兩種:
  a. 手動添加:
html

    class Meta:
        model = models.UserInfo
        fields = ["name", "password", "confirm_password", "email"]
        手動的修改,顯示什麼樣的錯誤信息  # 這裏我是修改settings中的,語言配置。 改爲 zh-hans
        error_messages = {
            "name": {"required": "用戶名不能爲空"},
            "password": {"required": "密碼不能爲空"},
            "confirm_password": {"required": "確認密碼不能爲空"},
            "email": {"required": "郵箱不能爲空"},
        }
     widgets = {"title": forms.TextInput(attrs={"class": "form-control"})}

 

 經過widgets 屬性, 對每個字段,添加屬性。 比較麻煩。
  b. 使用初始化方法, 繼承父類。進行修改。python

    def __init__(self, *args, **kwargs):
        super(UserInfoModelForm, self).__init__(*args, **kwargs)
        # 循環父類中生成的全部的字段,爲每個字段添加樣式, 一次性爲全部字典添加樣式
        for name, field in self.fields.items():
            field.widget.attrs["class"] = "form-control"

 3. 而後是,局部鉤子。 錯誤信息的展現:數據庫

    def clean_confirm_password(self):
        '''
        檢測兩次密碼 是否一致
        :return:
        '''
        password = self.cleaned_data.get("password")
        confrim_password = self.cleaned_data.get("confirm_password")
        if password != confrim_password:
            raise ValidationError("兩次密碼輸入不一致")
        return confrim_password

 

4. 編輯頁面 與 重置密碼。
      對於用戶的編輯,普通訊息和 密碼, 應該要分開進行。處理。  因此新添加兩個 forms 組件。
所有的forms組件:django

from django import forms
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
from rbac import models
import re

class UserInfoModelForm(forms.ModelForm):
    '''
    用戶 添加, form組件
    '''
    confirm_password = forms.CharField(label="確認密碼")
    class Meta:
        model = models.UserInfo
        fields = ["name", "password", "confirm_password", "email"]
        widgets = {
            "name":{}
        }
    def __init__(self, *args, **kwargs):
        super(UserInfoModelForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs["class"] = "form-control"

    def clean_confirm_password(self):
        '''
        檢測兩次密碼 是否一致
        :return:
        '''
        password = self.cleaned_data.get("password")
        confrim_password = self.cleaned_data.get("confirm_password")
        if password != confrim_password:
            raise ValidationError("兩次密碼輸入不一致")
        return confrim_password


class UpdateUserInfoModelForm(forms.ModelForm):
    '''
    修改用戶時, 使用這個form組件
    '''
    class Meta:
        model = models.UserInfo
        fields = ["name", "email"]

    def __init__(self, *args, **kwargs):
        super(UpdateUserInfoModelForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs["class"] = "form-control"


class ResetPasswordUserInfoModelForm(forms.ModelForm):
    '''重置密碼的工做'''
    confirm_password = forms.CharField(label="確認密碼")

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

    def __init__(self, *args, **kwargs):
        super(ResetPasswordUserInfoModelForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs["class"] = "form-control"

    def clean_confirm_password(self):
        '''
        檢測兩次密碼 是否一致
        :return:
        '''
        password = self.cleaned_data.get("password")
        confrim_password = self.cleaned_data.get("confirm_password")
        if password != confrim_password:
            raise ValidationError("兩次密碼輸入不一致")
        return confrim_password
針對用戶的 form 組件

視圖函數部分:bootstrap

'''角色管理'''
from django.shortcuts import HttpResponse, render, redirect
from django.http import JsonResponse
from django.urls import reverse
from rbac import models
from rbac.forms.user import UserInfoModelForm,UpdateUserInfoModelForm,ResetPasswordUserInfoModelForm


def user_list(request):
    '''
    角色列表的功能
    :param request:
    :return:
    '''
    user_queryset = models.UserInfo.objects.all()
    return render(request, "rbac/user_list.html", locals())


def user_add(request):
    '''
    添加角色的功能
    :param request:
    :return:
    '''
    forms = UserInfoModelForm()
    if request.method == "POST":
        forms = UserInfoModelForm(request.POST)
        if forms.is_valid():  # 驗證成功
            forms.save()  # 進行保存
            return redirect(reverse("rbac:user_list")) 
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    return render(request, "rbac/change.html", {"forms": forms})


def user_edit(request, pk):
    '''
    編輯角色
    :param request:
    :param pk:   要修改的角色id
    :return:
    '''
    user_obj = models.UserInfo.objects.filter(pk=pk).first()
    if not user_obj:
        return HttpResponse("用戶不存在")

    if request.method == "POST":
        forms = UpdateUserInfoModelForm(instance=user_obj, data=request.POST)
        if forms.is_valid():
            forms.save()
            return redirect(reverse("rbac:user_list"))
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = UpdateUserInfoModelForm(instance=user_obj)  # 將查詢出來的對象交給form組件, 進行渲染。
    return render(request, "rbac/change.html", {"forms": forms})


def user_del(request, pk):
    '''
    刪除操做, 須要給與用戶提示。
    :param reuqest:
    :param pk:  要刪除的角色id
    :return:
    '''
    origin_url = reverse("rbac:user_list")
    role_queryset = models.UserInfo.objects.filter(pk=pk)
    if not role_queryset:
        return HttpResponse("角色不存在")
    if request.method == "POST":
        role_queryset.delete()
        return redirect(origin_url)
    return render(request, "rbac/role_del.html", {"cancel": origin_url})


def reset_pwd(request, pk):
    '''
    重置密碼
    :param request:
    :param pk:
    :return:
    '''
    user_obj = models.UserInfo.objects.filter(pk=pk).first()
    if not user_obj:
        return HttpResponse("用戶不存在")

    if request.method == "POST":
        forms = ResetPasswordUserInfoModelForm(instance=user_obj, data=request.POST)
        if forms.is_valid():
            forms.save()
            return redirect(reverse("rbac:user_list"))
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = ResetPasswordUserInfoModelForm()
    return render(request, "rbac/change.html", {"forms": forms})
user 視圖函數

模板部分,只有展現列表,是不相同的, 其餘的 添加編輯, 刪除。 都是使用同一套頁面:ide

{% 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>ID</th>
                <th>用戶名</th>
                <th>郵箱</th>
                <th>重置密碼</th>
                <th>選項</th>
            </tr>
            </thead>
            <tbody>
            {% for user in user_queryset %}
                <tr>
                    <td>{{ forloop.counter }}</td>
                    <td>{{ user.id }}</td>
                    <td>{{ user.name }}</td>
                    <td>{{ user.email }}</td>
                    <td><a href="{% url 'rbac:reset_pwd' pk=user.id %}">重置密碼</a></td>
                    <td>
                        <a style="color: #333333;" href="{% url 'rbac:user_edit' pk=user.id %}">
                            <i class="fa fa-edit" aria-hidden="true"></i></a>
                        <a style="color: #d9534f;" href="{% url 'rbac:user_del' pk=user.id %}"><i
                                class="fa fa-trash-o"></i></a>
                    </td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
    </div>
{% endblock %}
模板部分

 

總結:
  - Model Form
    - 字段的自定製, 添加數據庫字段沒有的,額外字段。 並進行統一的驗證。
    - 局部鉤子的方法,用於對某一個字段, 進行二次校驗。
    - 錯誤提示:
      - 手動修改,使用 error_messages = {.......} , 每一個字段進行添加。
      - settings 中修改配置文件:  LANGUAGE_CODE = 'zh-hans'    使django中form組件的英文提示所有變成中文
    - 重寫__init__方法, 統一給全部的字段添加屬性   (class="form-control")函數

 

UserInfoModelForm
相關文章
相關標籤/搜索