Мой сайт запущен и работает. Однако, глупый я, я не вставил валидатор, чтобы проверить, могут ли пользователи и имя пользователя быть только в нижнем регистре (я только понял, что DJANGO допускает использование заглавных букв и имен пользователей). Хотя, я выставил предупреждение, но пользователи обычно игнорируют это, все еще пишут заглавные буквы или заглавные буквы в их регистрационных формах. Затем я сталкиваюсь с проблемой неработающих слагов, после чего мне приходится вручную менять их имена пользователей. Я не хочу менять поведение слизней, и вместо этого могу ли я попросить кого-то помочь изменить мои взгляды? Я пробовал .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})
1
Fahad Sher 8 Окт 2018 в 11:34

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() проверяет только регистр символов , поэтому, если строка содержит цифры, она все равно будет успешной. Таким образом, вы можете настроить чек. Или как указано в документации str.islower :

Вернуть True, если все символы в строке строчные и есть хотя бы один символ в регистре, иначе False.

Альтернативой может быть преобразование данных в нижний регистр, так что пользователь, вводящий 'FooBar', получает имя пользователя foobar, хотя это может привести к тому, что пользователи запутаются, что выбранное имя пользователя не имени пользователя, которое они получают.

2
Willem Van Onsem 8 Окт 2018 в 08:45

Замените username = form.cleaned_data['username'] на username = form.cleaned_data['username'].lower()

1
a_k_v 8 Окт 2018 в 08:38