Django-регистрация, как проверить, существует ли пользователь

#python #django #django-class-based-views #django-registration

#python #django #django-представления на основе классов #django-регистрация

Вопрос:

Я использую Django-registration с Django 1.8.15 для регистрации пользователей. Мой urls.py выглядит следующим образом:

 from registration.backends.hmac.views import RegistrationView

url(r'^registration/register/$', RegistrationView.as_view(form_class=MyCustomSubscriberForm), name="registration_register"),
  

По сути, это CBV, где я предоставляю форму и шаблон.
Вот форма:

 class MyCustomSubscriberForm(RegistrationForm):

class Meta:
    model = MyCustomSubscriber
    fields = ('firstname', 'surname', 'email', ) 
  

Моя проблема в том, как обрабатывать проверку в этом CBV?

На данный момент, если, например, кто-то пытается зарегистрироваться с уже используемым адресом электронной почты, Django выдает IntegrityError at /registration/register/

Каков наилучший способ использовать валидаторы из Django-registrations? Например — как мне убедиться, что если пользователь с определенным e-mail уже существует, пользователи получают уведомление в шаблоне?

Как расширить этот CBV или обработать эту ошибку в моем коде с помощью тех средств проверки, которые уже предоставлены Django-Registration?

Ответ №1:

Вам нужно проверить электронные письма в clean_<field> методе вашей формы и вызвать ошибку, если это дубликат электронного письма, которое вы сможете отобразить в своем шаблоне.

Пожалуйста, взгляните на этот раздел из документации: Очистка определенного атрибута поля

Итак, у вас может быть что-то вроде приведенного ниже кода:

 def clean_email(self):
    data = self.cleaned_data['email']
    duplicate_users = User.objects.filter(email=data)
    if self.instance.pk is not None:  # If you're editing an user, remove him from the duplicated results
        duplicate_users = duplicate_users.exclude(pk=self.instance.pk)
    if duplicate_users.exists():
        raise forms.ValidationError("E-mail is already registered!")
    return data
  

Комментарии:

1. вам нужно управлять режимом редактирования 😉 qs = User.objects.filter(email=data) if self.instance.id: qs = qs.exclude(id=id)

2. Вы абсолютно правы, я отредактировал свой ответ. Но поскольку у него есть регистрационная форма, он может не использовать ее для редактирования.

3. Спасибо за ваше предложение, это, безусловно, возможно! Конечно, это правильный ответ, однако также есть возможность использовать встроенную функцию Django-Registration, которая делает именно это — как описано в моем ответе.

Ответ №2:

Более внимательно изучив Django-registration, я обнаружил, что в Django-registration уже реализована эта функциональность в одной из ее форм: RegistrationFormUniqueEmail которая является подклассом RegistrationForm .

Чтобы использовать это, мне просто нужно было подклассировать его в моей форме следующим образом:

 class MyCustomSubscriberForm(RegistrationFormUniqueEmail):

    def __init__(self, *args, **kwargs):
        super (RegistrationFormUniqueEmail, self).__init__(*args, **kwargs)

   class Meta: 
      model = get_user_model()
      fields = ('firstname', 'lastname', 'email') 
  

И это было все — форма проверяла, является ли указанный адрес электронной почты уникальным.