首页 > 解决方案 > 如何在密码字段中放置条件?

问题描述

我正在用 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."
        )

标签: pythondjango

解决方案


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', },
]

推荐阅读