python - 如何在 Django 2.0 中为小写用户创建验证器?
问题描述
我的网站已启动并正在运行。但是,愚蠢的我没有放入验证器来检查用户和用户名是否只能小写(我只意识到 DJANGO 允许大写的用户和用户名)。虽然,我已经提出警告,但用户通常会忽略在他们的注册表单中仍然写大写字母或大写字母的情况。然后我遇到蛞蝓不工作的问题,此后我必须手动更改他们的用户名。我不想改变蛞蝓的行为,我可以请别人帮忙改变我的观点吗?我也尝试过 .lower() .format() 并且没有用。我对验证器非常薄弱。
表格.py
from django.contrib.auth.models import User
from django import forms
from captcha.fields import CaptchaField
class SignUpForm(forms.ModelForm):
captcha = CaptchaField()
password = forms.CharField(max_length= 15, widget=forms.PasswordInput)
class Meta:
model = User
fields = ['username', 'email', 'password']
视图.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from django.views import generic
from django.views.generic import View
from home.forms import SignUpForm
class SignUpFormView(View):
form_class = SignUpForm
template_name = 'home/signup.html'
#if there is no sign up yet
def get(self,request):
form = self.form_class(None)
return render(request, self.template_name, {'form': form})
#if going to sig up
def post(self,request):
form = self.form_class(request.POST)
if form.is_valid():
#it takes information but does save it
user = form.save(commit = False)
#cleaned normalized data
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user.set_password(password)
user.save()
#returns if it is all correct
user = authenticate(username = username, password = password)
if user is not None:
if user.is_active:
login(request, user)
return redirect("userprofile:newprofile")
return render(request, self.template_name, {'form': form})
解决方案
您可以在以下位置添加验证SignupForm
:
from django.contrib.auth.models import User
from django import forms
from captcha.fields import CaptchaField
class SignUpForm(forms.ModelForm):
captcha = CaptchaField()
password = forms.CharField(max_length= 15, widget=forms.PasswordInput)
def clean_username(self):
data = self.cleaned_data['username']
if not data.islower():
raise forms.ValidationError("Usernames should be in lowercase")
return data
class Meta:
model = User
fields = ['username', 'email', 'password']
因此,如果data.islower()
检查失败(username
包含大写字符),它将引发 a ValidationError
,因此表单无效。
请注意,islower()
仅检查基于大小写的字符,因此如果字符串包含数字,它仍然会成功。因此,您可能需要微调检查。或如以下文档中所述str.islower
:
True
如果字符串中的所有大小写字符都是小写并且至少有一个大小写字符,则返回,False
否则。
另一种方法可能是将数据转换为小写,这样输入的用户'FooBar'
会得到 username foobar
,尽管这可能会导致用户混淆他们选择的用户名不是他们获得的用户名。
推荐阅读
- php - 编辑时从下拉列表中显示其他表格数据
- r - 根据向量提供的变量名称和权重创建平均变量
- php - 扩展 PHP ArrayObject 导致错误的下标值
- javascript - 状态改变后如何在react redux组件中显示文本数据?
- aws-sdk - 强制 lex 引出特定插槽
- javascript - RxJS - 为什么我要使用 throwError 而不是简单地抛出错误?
- angular - 如何等待'for loop next iteration'直到获得 FileReader.onload 结果
- node.js - Yeoman 生成器在带有 Node 10 的 Windows 10 上除外
- python - Python中的乘法表
- pandas - 在熊猫中将时间戳转换为to_date