验证密码的位数并包含数字、字母和符号。
models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
'''继承内置用户表'''
...
forms.py
import re
from django import forms
from django.contrib.auth import get_user_model
User = get_user_model()
class UserModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UserModelForm, self).__init__(*args, **kwargs)
self.fields['password'].help_text = '密码十位以上必须包含数字、大写字母、小写字母、符号(非数字字母)'
def clean_password(self):
'''验证表单提交的密码字段'''
pw = self.cleaned_data['password']
r = r'(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[_\W]).{10,}'
result = re.match(r, pw)
if not result:
# 不满足条件
raise forms.ValidationError('密码不符合')
return pw
class Meta:
model = User
fields = '__all__'
# exclude = ()
admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
from users.forms import UserModelForm
User = get_user_model()
class UserAdmin(admin.ModelAdmin):
form = UserModelForm
def save_model(self, request, obj, form, change):
if obj.pk:
# 修改
orig_obj = User.objects.get(pk=obj.pk)
if obj.password != orig_obj.password:
# 密码改变
obj.set_password(obj.password)
else:
# 新建
obj.set_password(obj.password)
obj.save()
def get_queryset(self, request):
return User.objects.all()
这个博客介绍了如何在 Django 中创建一个用户注册表单,该表单要求密码至少为十位,并且必须包含数字、大写字母、小写字母和一个特殊字符。在 `forms.py` 中定义了 `UserModelForm` 类,它重写了 `clean_password` 方法以进行复杂度验证。如果密码不满足条件,将抛出验证错误。在 `admin.py` 中,`UserAdmin` 类使用了这个表单,确保在后台管理中保存用户时也遵循同样的密码规则。
1577

被折叠的 条评论
为什么被折叠?



