我的网站已启动并正在运行。但是,很傻的我,我没有放入验证器来检查用户名和用户名是否只能小写(我才意识到DJANGO允许使用大写的用户名和用户名)。虽然,我发出了警告,但用户通常会忽略,仍然在注册表格中写大写字母或大写字母。然后,我遇到了not无法正常工作的问题,此后,我不得不手动更改其用户名。我不想更改of的行为,而是可以请他人寻求帮助来改变我的观点吗?我也尝试过.lower().format(),但是没有用。我对验证人的能力很弱。
forms.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']
Views.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})
答案 0 :(得分:2)
您可以在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
包含大写字符),它将引发ValidationError
,因此该表格无效。
请注意,islower()
仅检查基于大小写的字符,因此,如果字符串中包含数字,它将仍然成功。因此,您可能需要微调支票。或如documentation of str.islower
中指定:
如果字符串中所有大小写的字符均为小写字母,则返回
True
至少有一个大小写字符,否则为False
。
另一种可能是将数据转换为小写,这样输入'FooBar'
的用户将获得用户名foobar
,尽管这可能导致用户感到困惑,因为他们选择的用户名不是他们获得的用户名。
答案 1 :(得分:1)
将username = form.cleaned_data['username']
更改为username = form.cleaned_data['username'].lower()