python - 如何在密码字段中放置条件?
问题描述
我正在用 Django 创建一个系统。我已经在项目开始时创建了一个登录页面。但是现在,我意识到我没有密码字段的条件。我想设置一些限制,例如 8 个字符、大小写字母和数字。用户填写表格时如何检查?
表格.py
class SignUpForm(forms.ModelForm):
password1 = forms.CharField(max_length=250, min_length=8, widget=forms.PasswordInput)
password2 = forms.CharField(max_length=250, min_length=8, widget=forms.PasswordInput)
...
模型.py
class UserProfile(AbstractUser, UserMixin):
...
last_name = models.CharField(max_length=200)
password = models.CharField(max_length=250)
视图.py
def signup(request):
current_user = request.user
new_user = UserProfile(company=current_user.company)
form = SignUpForm(request.POST or None, user=request.user, instance=new_user)
rank_list = Rank.objects.filter(company=current_user.company)
if request.method == 'POST':
if form.is_valid():
form.instance.username = request.POST.get('email', None)
new_user = form.save()
...
}
return render(request, 'signup.html', context)
编辑
我根据答案添加了代码,但它不起作用。
设置.py
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 12, }
},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
{'NAME': 'register.validators.UppercaseValidator', },
{'NAME': 'register.validators.NumberValidator', },
{'NAME': 'register.validators.LowercaseValidator', },
]
注册/验证器.py
import re
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _
class NumberValidator(object):
def __init__(self, min_digits=0):
self.min_digits = min_digits
def validate(self, password, user=None):
if not len(re.findall('\d', password)) >= self.min_digits:
raise ValidationError(
_("The password must contain at least %(min_digits)d digit(s), 0-9."),
code='password_no_number',
params={'min_digits': self.min_digits},
)
def get_help_text(self):
return _(
"Your password must contain at least %(min_digits)d digit(s), 0-9." % {'min_digits': self.min_digits}
)
class UppercaseValidator(object):
def validate(self, password, user=None):
if not re.findall('[A-Z]', password):
raise ValidationError(
_("The password must contain at least 1 uppercase letter, A-Z."),
code='password_no_upper',
)
def get_help_text(self):
return _(
"Your password must contain at least 1 uppercase letter, A-Z."
)
class LowercaseValidator:
def validate(self, password, user=None):
if not re.findall('[a-z]', password):
raise ValidationError(
_("The password must contain at least 1 lowercase letter, a-z."),
code='password_no_lower',
)
def get_help_text(self):
return _(
"Your password must contain at least 1 lowercase letter, a-z."
)
解决方案
Django 包含一些基本的验证器(文档)
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
但是您可以创建自己的验证器:
在您的应用中,创建 validators.py
并在那里添加您的验证类(文档)
# EX Validation for uppercase
class UppercaseValidator(object):
def validate(self, password, user=None):
if not re.findall('[A-Z]', password):
raise ValidationError(
_("The password must contain at least 1 uppercase letter, A-Z."),
code='password_no_upper',
)
def get_help_text(self):
return _(
"Your password must contain at least 1 uppercase letter, A-Z."
)
最后使用验证器的路径更新 AUTH_PASSWORD_VALIDATORS 设置
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 12, }
},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
{'NAME': 'myproject.validators.UppercaseValidator', },
]
推荐阅读
- excel - Excel 宏/VBA - 复制选定的行并添加重复值
- ubuntu - 如何在 Ubuntu 上彻底清除 Visual Studio Code?
- html - 在 HTML 中保持按钮对齐
- coq - 在 coq 中推广一组证明
- magento - Magento 2 导入产品属性类型固定产品税
- c - 尝试使用解密时间来解密代码
- python - keras 中的截断反向传播,每批一个序列
- java - Spring boot Jasper 报告:Java bean 作为数据源
- qt - 如何在 QSGNode 中添加新节点
- reportlab - reportlab pdfmetrics ttfont postscript错误