Как я могу избежать регистрации пользователем уже использованного электронного письма в django? - PullRequest
1 голос
/ 03 мая 2019

Я тестировал свой вид регистрации и заметил, что если я попытаюсь зарегистрироваться, используя существующее имя пользователя alreaxy, я получу ошибку;если я попытаюсь зарегистрироваться, используя уже существующее письмо, приложение позволит мне сделать это.

Очевидно, я не хочу, чтобы кто-то регистрировал несколько аккаунтов с одним и тем же письмом на моем сайте.Я довольно новичок в Django, и, так как я заметил, что форма проверила, если имя пользователя уже существует, я подумал, что он будет делать то же самое с полем электронной почты.

Я действительно не знаю, как перейти отчто, я должен работать на мой взгляд или на форме?И как я могу сделать это через мою БД и найти, если электронная почта уже была зарегистрирована?Я думал, что email = form.cleaned_data.get('email') поможет, но это не так.Любая помощь приветствуется.

Вот мой взгляд:

def register(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')
            email = form.cleaned_data.get('email')
            messages.success(request, f"New Account Created: {username}")
            login(request, user)
            messages.info(request, f"You are now logged in as {username}")
            return redirect("main:homepage")
        else:
            for msg in form.error_messages:
                messages.error(request, f"{msg}: {form.error_messages[msg]}")


    form = NewUserForm
    return render(request,
                  "main/register.html",
                  context={"form":form})

А вот форма:

class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)


    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")


    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        if commit:
            user.save()
        return user

1 Ответ

2 голосов
/ 03 мая 2019

Согласно вашему коду, все, что вам нужно сделать, это поднять ValidationError из вашей формы


class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)

    <b>def clean_email(self):
        if User.objects.filter(email=self.cleaned_data['email']).exists():
            raise forms.ValidationError("the given email is already registered")
        return self.cleaned_data['email']</b>

    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")
...