如何在Django 2.0中为小写用户创建验证器?

时间:2018-10-08 08:34:12

标签: python django

我的网站已启动并正在运行。但是,很傻的我,我没有放入验证器来检查用户名和用户名是否只能小写(我才意识到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})

2 个答案:

答案 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()