2011-04-24 21 views
6

que utilizan el sistema django.auth y no tengo esto:Django auth.user con el correo electrónico única

class RegisterForm(UserCreationForm): 
    username = forms.RegexField(label= "Username" , max_length = 30, regex = r'^[\w]+$', error_messages = {'invalid': "This value may contain only letters, numbers and _ characters."}) 
    email = forms.EmailField(label = "Email") 
    first_name = forms.CharField(label = "First name", required = False) 
    last_name = forms.CharField(label = "Last name", required = False) 

    class Meta: 
     model = User 
     fields = ("username", "first_name", "last_name", "email",) 

    def save(self, commit = True): 
     user = super(RegisterForm, self).save(commit = False) 
     user.first_name = self.cleaned_data["first_name"] 
     user.last_name = self.cleaned_data["last_name"] 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 

Quiero configurar mensajes de correo electrónico como únicos y comprobar la forma de esta validación. ¿Cómo puedo hacerlo?

+0

posible duplicado de [Cómo hacer que el campo de correo electrónico única en el modelo de usuario contrib.auth en Django] (http: // stackoverflow. com/questions/1160030/how-to-make-email-field-unique-in-model-user-from-contrib-auth-in-django) –

Respuesta

9

Agregue esto a su formulario. Pero esta no es la manera perfecta. condición de carrera está disponible solo usando este formulario. Te recomiendo que añadas una restricción única a nivel db.

def clean_email(self): 
    data = self.cleaned_data['email'] 
    if User.objects.filter(email=data).exists(): 
     raise forms.ValidationError("This email already used") 
    return data 

SQL para añadir restricción única:

ALTER TABLE auth_user ADD UNIQUE (email) 
+0

¿Por qué esta es una buena manera? Además, si uso de esta manera y agrego un "único = verdadero" en mi campo de DB, ¿está bien? –

+0

no se puede cambiar el modelo django auth.user sin el parche de mono ni parchear django. por lo que no puede agregar unique = True al modelo de usuario fácilmente. – mumino

0

Sustitución del método clean() según lo sugerido por mumimo se describe aquí: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method

general usted podría utilizar única = True en su campo definición y luego use ModelForm, para que se ejecute automáticamente clean() para todos los campos en su formulario, pero si está utilizando la clase de usuario django.auth no puede modificar los campos.

+0

Yo uso django.auth. ¿Qué debería usar en lugar de esto? –

1

No estoy seguro de cómo utilizar esto, pero

from django.contrib.auth.models import User 
User._meta.get_field_by_name('email')[0].unique=True 

debe hacerlo. Supongo que esto va en su models.py antes de ejecutar syncdb en el modelo de autenticación. Combate para probar esto yo mismo.

14

En algún lugar de sus modelos:

from django.contrib.auth.models import User 
User._meta.get_field('email')._unique = True 

Aviso el subrayado antes unique. Aquí es donde realmente se guarda la información. User._meta.get_field('email').unique es solo un @property que se ve en él.

Esto debería funcionar para syncdb también, por lo que tendrá coherencia con la base de datos.

Tenga en cuenta también que desde Django 1.5 no tendrá que hacer tales cosas, ya que el modelo de usuario será conectable.

+1

Esto falla con Django 1.8 y superior. Dice que se deniega el permiso – Peter

+0

@Peter: use sudo cuando makemigrations – LiberiFatali

+0

Solución brillante. Upvoted. Gracias. –

0

Usted puede hacer lo mismo que el uso de este modelo en el Resumen del usuario:

class User(AbstractUser): 
... 

class Meta: 
    unique_together = ('email',) 
Cuestiones relacionadas