流程都是同樣的。就不在詳細的記錄。只寫一點須要注意的地方! 或者 能夠改進的地方!
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
視圖函數部分: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})
模板部分,只有展現列表,是不相同的, 其餘的 添加編輯, 刪除。 都是使用同一套頁面: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