Password Validation - Require Letters and Numbers - no regex

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from django import forms

""" slower clean() method using regex

    def clean(self, value):
        import re
        if not re.search('[a-zA-Z]+', value) or not re.search('[0-9]+', value):
            raise forms.ValidationError(u'Your password must include at least \
                                       one letter and at least one number.')
"""

# Password Field (Extends CharField) (Optimized Version)
import string
class PasswordField(forms.CharField):
    
    # Setup the Field
    def __init__(self, *args, **kwargs):
        super(PasswordField, self).__init__(min_length = 7, required = True,
                        label = u'Password',
                        widget = forms.PasswordInput(render_value = False),       
                        *args, **kwargs)
    
    # Validate - 1+ Numbers, 1+ Letters
    def clean (self, value):
        
        # Setup Our Lists of Characters and Numbers
        characters = list(string.letters)
        numbers = [str(i) for i in range(10)]
        
        # Assume False until Proven Otherwise
        numCheck = False
        charCheck = False

        # Loop until we Match        
        for char in value: 
            if not charCheck:
                if char in characters:
                    charCheck = True
            if not numCheck:
                if char in numbers:
                    numCheck = True
            if numCheck and charCheck:
                break
        
        if not numCheck or not charCheck:
            raise forms.ValidationError(u'Your password must include at least \
                                          one letter and at least one number.')

        return super(PasswordField, self).clean(value)

More like this

  1. Simple E-mail registration by bthomas 5 years, 5 months ago
  2. SAS70 Compliant Password Validator by czieler 6 years, 8 months ago
  3. Spanish National Identification Number Field (DNI) by cues7a 2 years, 10 months ago
  4. Password Obfuscation Log Filter by nikmolnar 9 months, 3 weeks ago
  5. use oldforms validators in newforms forms by garywilson 7 years ago

Comments

kurtis (on September 22, 2011):

We forgot a very important part of this. It needs to be added on to the end of the clean function(s):

[HTML_REMOVED]return super(PasswordField, self).clean(value)[HTML_REMOVED]

#

kurtis (on September 22, 2011):

Whoops, I used the wrong syntax for the code. Anyways, here it is:

return super(PasswordField, self).clean(value)

#

watchedman (on September 30, 2011):

Nice catch kurtis, I added in the missing line. Thanks.

#

(Forgotten your password?)