0

J'utilise Django-registration avec Django 1.8.15 pour enregistrer les utilisateurs. Mon urls.py ressemble à ceci:Django-enregistrement comment vérifier si l'utilisateur existe

from registration.backends.hmac.views import RegistrationView 

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

C'est essentiellement un CBV où je donne la forme et le modèle. Voici la forme:

class MyCustomSubscriberForm(RegistrationForm): 

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

Mon problème est de savoir comment gérer la validation dans ce CBV?

Actuellement, si par ex. quelqu'un essaie de s'enregistrer avec une adresse e-mail déjà utilisée Django donne un IntegrityError at /registration/register/ ...

Quelle est la meilleure façon d'utiliser Validators from Django-registrations? Par exemple - comment est-ce que je m'assure que si un utilisateur avec un certain email existe déjà les utilisateurs sont notifiés dans le modèle?

Comment étendre ce CBV ou gérer cette erreur dans mon code avec les validateurs déjà fournis par Django-Registration?

Répondre

0

Après avoir examiné Django-inscription plus attentivement j'ai découvert que Django- l'enregistrement a déjà cette fonctionnalité implémentée sous l'une de ses formes: RegistrationFormUniqueEmail qui est une sous-classe de .

Pour utiliser ce que je viens d'avoir à sous-classe dans ma forme comme ceci:

class MyCustomSubscriberForm(RegistrationFormUniqueEmail): 

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

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

Et ce fut tout - la forme vérifiait le si l'adresse e-mail fournie est unique.

2

Vous devez valider les e-mails dans la méthode clean_<field> de votre formulaire et relancer et corriger s'il s'agit d'un e-mail en double que vous pourrez rendre dans votre modèle.

S'il vous plaît jeter un oeil à cette section de la documentation: Cleaning a specific field attribute

Vous pouvez donc avoir quelque chose comme le code ci-dessous:

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 
+0

vous devez gérer le mode d'édition;) '' 'qs = User.objects.filter (email = données) si self.instance.id: qs = qs.exclude (id = id)' '' – Mounir

+0

Vous avez absolument raison, j'ai édité ma réponse. Mais puisqu'il a un formulaire d'inscription, il ne l'utilisera peut-être pas pour l'édition. – ihhcarus

+0

Merci pour votre suggestion, c'est certainement possible! Certes, il s'agit d'une réponse valide, mais il est également possible d'utiliser la fonctionnalité intégrée Django-Registration qui fait exactement cela - comme cela est décrit dans ma réponse. – user1544500