[英]Client-Side Verification Django
我是 Django 的新手,我制作了一个扩展 UserCreationForm 的表单,我想验证客户端的输入。 我怎样才能做到这一点? 当我验证 password1 时,它工作得很好,但由于某种原因,我无法检查字段是否丢失。 提前致谢。
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
def validate(self,password):
return self.short_enough(password) and self.has_lowercase(password) and self.has_uppercase(password) and self.has_numeric(password) and self.has_special(password)
def short_enough(self,pw):
return len(pw) == 8
def has_lowercase(self,pw):
'Password must contain a lowercase letter'
return len(set(string.ascii_lowercase).intersection(pw)) > 0
def has_uppercase(self,pw):
'Password must contain an uppercase letter'
return len(set(string.ascii_uppercase).intersection(pw)) > 0
def has_numeric(self,pw):
'Password must contain a digit'
return len(set(string.digits).intersection(pw)) > 0
def has_special(self,pw):
'Password must contain a special character'
return len(set(string.punctuation).intersection(pw)) > 0
def clean(self):
cleaned_data = super(UserRegisterForm, self).clean()
username = cleaned_data.get('username')
email = cleaned_data.get('email')
password1 = cleaned_data.get('password1')
password2 = cleaned_data.get("password2")
if username == None or email == None or password1 == None or password2 == None:
raise forms.ValidationError("Some fields are missing" )
if not self.validate(password1):
raise forms.ValidationError("Password must be 8 characters(1 upper, 1 lower, 1 number, 1 special character)" )
else:
return cleaned_data
这是我的 HTML 文件,问题是我使用的是 {{ form }} 而不是 HTML 输入:
{% extends "blog/base.html" %} {% load crispy_forms_tags %} {% block content %} <div class="content-section"> <form method="POST" > {% csrf_token %} <fieldset class="form-group" aria-required="true"> <legend class="border-bottom mb-4"> Join Today </legend> {{ form|crispy }} </fieldset> <div class="form-group"> <button class="btn btn-outline-info" type="submit" > Sign Up </button> </div> </form> <div class="border-top pt-3"> <small class="text-muted"> Already have an account? <a class="ml-2" href="{% url 'login' %}" >Sign In</a> </small> </div> </div> {% endblock content %}
好的,您的模板看起来不错,只是在您的表单中添加了一些内容。
为了简化代码,我将required=True
添加到您定义的 email 字段并将相同的参数设置到__init__
字段的 rest 方法中,这将根据需要执行所有字段,您可以摆脱自定义“空值”验证在clean
的
class UserRegisterForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['username'].required = True
self.fields['password1'].required = True
self.fields['password2'].required = True
def validate(self,password):
return self.short_enough(password) and self.has_lowercase(password) and self.has_uppercase(password) and self.has_numeric(password) and self.has_special(password)
def short_enough(self,pw):
return len(pw) == 8
def has_lowercase(self,pw):
'Password must contain a lowercase letter'
return len(set(string.ascii_lowercase).intersection(pw)) > 0
def has_uppercase(self,pw):
'Password must contain an uppercase letter'
return len(set(string.ascii_uppercase).intersection(pw)) > 0
def has_numeric(self,pw):
'Password must contain a digit'
return len(set(string.digits).intersection(pw)) > 0
def has_special(self,pw):
'Password must contain a special character'
return len(set(string.punctuation).intersection(pw)) > 0
def clean(self):
cleaned_data = super(UserRegisterForm, self).clean()
password1 = cleaned_data.get('password1')
password2 = cleaned_data.get("password2")
if not self.validate(password1):
raise forms.ValidationError("Password must be 8 characters(1 upper, 1 lower, 1 number, 1 special character)" )
else:
return cleaned_data
另一方面,要进行单字段验证,我建议您向用户 django 提供方法clean_<fieldname>
,在此处查看文档 --> https://docs.djangoproject.com/en/3.1/ref/forms/validation /#cleaning-a-specific-field-attribute
当您使用 django crispy forms 时,您可以在表单定义中包含提交按钮以及表单标签,它会将所有表单 DOM 封装在您的 python 代码中,我认为这很棒,请查看文档 --> https: //django-crispy-forms.readthedocs.io/en/latest/layouts.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.