2016-09-20 1 views
1

Mon site est configuré pour qu'il n'y ait pas de nom d'utilisateur (ou plutôt user.username = user.email). Django a un message d'erreur si un utilisateur essaie de saisir un nom d'utilisateur déjà dans la base de données, mais comme je n'utilise pas de nom d'utilisateur pour l'enregistrement, je n'arrive pas à comprendre comment procéder.Django 1.9 vérifier si email existe déjà

Tout comme les paramètres par défaut sont déjà, je ne veux pas recharger la page pour savoir si une adresse e-mail est déjà associée à un utilisateur. Ma conjecture est d'utiliser Ajax, mais je ne peux pas comprendre comment le faire. J'ai regardé d'autres articles, mais il ne semble pas y avoir quelque chose de récent.

Comment puis-je vérifier si une adresse e-mail existe déjà et, si oui, donner un message d'erreur pour que l'utilisateur saisisse une nouvelle adresse e-mail?

models.py:

class MyUsers(models.Model): 
    user = models.OneToOneField(User) 
    first_name = models.CharField(max_length=100, blank=True) 
    last_name = models.CharField(max_length=100, blank=True) 
    email = models.EmailField(max_length=100, blank=True, unique=True) 
    company = models.CharField(max_length=100, blank=True, null=True) 
    website = models.URLField(max_length=100, blank=True, null=True) 
    phone_number = models.CharField(max_length=100, blank=True, null=True) 

    def __str__(self): 
     return self.user.username 

forms.py:

class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('email',) 


class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('first_name', 'last_name', 'company', 'website', 'phone_number') 

views.py:

def index(request): 
    registered = False 

    if request.method == 'POST': 
     user_form = UserForm(data=request.POST) 
     profile_form = UserProfileForm(data=request.POST) 

     if user_form.is_valid() and profile_form.is_valid(): 
      user = user_form.save() 
      user.set_password(user.password) 
      user.password = "" 
      user.username = user.email 
      user.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user 
      profile.email = user.email 
      profile.save() 

      user.first_name = profile.first_name 
      user.last_name = profile.last_name 
      user.save() 

      registered = True 
      return HttpResponseRedirect(reverse('registration')) 
     else: 
      print user_form.errors, profile_form.errors 
    else: 
     user_form = UserForm() 
     profile_form = UserProfileForm1() 

    context = {'user_form': user_form, 'profile_form': profile_form, 'registered': registered} 
    return render(request, 'mysite/register.html', context) 

register.html:

{% extends 'mysite/base.html' %} 
{% load staticfiles %} 

{% block title_block %} 
    Register 
{% endblock %} 

{% block head_block %} 
{% endblock %} 

{% block body_block %}  
    <form id="user_form" method="post" action="/mysite/" enctype="multipart/form-data"> 
     {% csrf_token %} 
     {{ user_form.as_p }} 
     {{ profile_form.as_p }} 

     <input type="submit" name="submit" value="Register" /> 
    </form> 
{% endblock %} 
+0

Ceci est une question très large. On dirait que le code fonctionne à un certain niveau. Identifiez la prochaine étape, faites de votre mieux pour résoudre cela, et si vous avez un problème plus spécifique, nous pourrions peut-être vous aider. – dckuehn

+0

J'ai ajouté mes fichiers pour montrer le code sur lequel je travaille. L'étape suivante consiste à déterminer comment afficher un utilisateur s'il a déjà entré la même adresse e-mail ou s'il utilise accidentellement l'adresse e-mail de quelqu'un d'autre. – Lefty

Répondre

1

Vous pouvez remplacer la méthode clean_<INSERT_FIELD_HERE>() sur le UserForm pour vérifier ce cas particulier. Il avait l'air quelque chose comme ceci:

forms.py:

class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('email',) 

    def clean_email(self): 
     # Get the email 
     email = self.cleaned_data.get('email') 

     # Check to see if any users already exist with this email as a username. 
     try: 
      match = User.objects.get(email=email) 
     except User.DoesNotExist: 
      # Unable to find a user, this is fine 
      return email 

     # A user was found with this as a username, raise an error. 
     raise forms.ValidationError('This email address is already in use.') 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('first_name', 'last_name', 'company', 'website', 'phone_number') 

Vous pouvez en savoir plus sur les champs spécifiques de nettoyage sous une forme dans le Django documentation sur les formes. Cela dit, je pense que vous devriez envisager de créer un custom user model au lieu de traiter votre classe User Profile comme un wrapper pour User.

+1

Je pense que c'est plutôt 'match = User.objects.get (email = email)'. –

+0

@GeoffreyR. Merci, je n'ai pas remarqué que j'avais un argument différent. J'ai mis à jour ma réponse. – tredzko