首页 > 解决方案 > 如何在 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})

标签: pythondjango

解决方案


您可以在以下位置添加验证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,尽管这可能会导致用户混淆他们选择的用户名不是他们获得的用户名。


推荐阅读