如何在DJANGO中为特殊字符创建验证器?

时间:2018-10-09 14:47:19

标签: python django

我的网站已经启用,但是有问题。每当有人用用户名中的特殊字符进行注册时,服务器就会给出错误(针对整个站点),因为该条无法显示特殊字符,例如@,-,|但是django用户模型允许用户使用特殊字符进行注册。有什么办法可以在注册表单中引发验证器错误。

下面是我的表格。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)

    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
       help_texts = {
        'username': 'Required. Please only use lower-case alphabets and 
        numbers.',
          }
        fields = ['username', 'email', 'password']

views.py

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 :(得分:0)

如果了解,您想验证数字或字母只接受登录吗?

您可以这样做:

def validate_digits_letters(word):
    for char in word:
        if not char.isdigit() and not char.isalpha():
            return False
    return True


def clean_username(self):
    data = self.cleaned_data['username']
    if not data.islower():
        raise forms.ValidationError("Usernames should be in lowercase")

    if not validate_digits_letters(data):
        raise forms.ValidationError("Usernames contains characters that are not numbers nor letters")

    return data

答案 1 :(得分:0)

def clean_username(self):
        data = self.cleaned_data['username']
        if not data.islower():
           raise forms.ValidationError("Usernames should be in lowercase")
        if '@' in data or '-' in data or '|' in data:
           raise forms.ValidationError("Usernames should not have special characters.")
        return data

您可以使用此