博客 / 詳情

返回

Django學習筆記013-管理員

1、確認密碼

1.1類
class AdminModelsForm(BootStrapModelForm):
    '''管理員'''
    confirm_password = forms.CharField(
        label="確認密碼",
        widget=forms.PasswordInput(render_value=True)
    ) 

    class Meta:
        model = models.Admin
        fields = ["username", "password", "confirm_password"]
        widgets = {
            # render_value=True輸入不一致密碼後,不清空輸入框的密碼
            "password": forms.PasswordInput(render_value=True),
        }
1.2鈎子函數驗證密碼是否一致
    clean_表單名
    def clean_confirm_password(self):
        pwd = self.cleaned_data.get("password")
        confirm = md5(self.cleaned_data.get("confirm_password"))
        if pwd != confirm:
            raise ValidationError("密碼不一致")

        return confirm

2、添加管理員

def admin_add(request):
    '''添加管理員'''
    title = "新建管理員"
    if request.method == "GET":
        form = AdminModelsForm()
        return render(request, "change.html", {"form": form, "title": title})
    form = AdminModelsForm(data=request.POST)
    if form.is_valid():
        # print(form.cleaned_data)
        form.save()
        return redirect("/admin/list")

    return render(request, "change.html",  {"form": form, "title": title})

3、重置密碼

def admin_reset(request, nid):
    '''重置管理員密碼'''
    row_object = models.Admin.objects.filter(id=nid).first()
    if not row_object:
        return redirect("/admin/list")
    title = "重置管理員密碼-{}".format(row_object.username)
    if request.method == "GET":
        
        form = AdminResetModelsForm()
        return render(request, "change.html", {"form": form, "title": title})
    form = AdminResetModelsForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect("/admin/list")
    return render(request, "change.html", {"form": form, "title": title})

4、MD5加密密碼

#加密函數
from django.conf import settings
import hashlib

def md5(data_string):
    salt = settings.SECRET_KEY
    obj = hashlib.md5(salt.encode('utf-8'))
    obj.update(data_string.encode('utf-8'))
    return obj.hexdigest()

#針對加密密碼進行驗證
class AdminResetModelsForm(BootStrapModelForm):
    '''重置管理員密碼ModelForm'''

    confirm_password = forms.CharField(
        label="確認密碼",
        widget=forms.PasswordInput(render_value=True)
        )

    class Meta:
        model = models.Admin
        fields = ["password",'confirm_password']
        widgets = {
            # render_value=True輸入不一致密碼後,不清空輸入框的密碼
            "password": forms.PasswordInput(render_value=True),
            }


    def clean_password(self):
        '''passowrd勾子函數'''
        pwd = self.cleaned_data.get("password")
        md5_pwd = md5(pwd)
        exists = models.Admin.objects.filter(id=self.instance.pk, password=md5_pwd).exists() 
        #self.intance.pk獲取admin_reset中待重置行的管理員ID
        if exists:
            raise ValidationError("不能使用已經用過的密碼")
        return md5_pwd
    

    def clean_confirm_password(self):
        pwd = self.cleaned_data.get("password")
        confirm = md5(self.cleaned_data.get("confirm_password"))
        if pwd != confirm:
            raise ValidationError("密碼不一致")

        return confirm
user avatar solomonxie 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.