2010-02-17 19 views
7

Hubo una pregunta casi similar: How to make email field unique in model User from contrib.auth in DjangoMaking único con Django usuario admin

La solución no era perfecto: Validación de correo electrónico para la unicidad. La solución provista es bastante divertida. No permite modificaciones al Usuario que dejan el correo electrónico intacto. ¿Como arreglarlo? ¡Gracias por adelantado!

+0

cuál de las soluciones propuestas estás hablando? la solución aceptada? –

+0

Sí. El aceptado. – Viet

+0

Respondí en la otra pregunta. Creo que este debería estar cerrado ya que es un duplicado completo. –

Respuesta

2

Gracias a Ofri Raviv, pero lo que he visto no es lo que necesitaba. Así que resolví mi problema y ahora me gustaría compartir los consejos:

  1. usamos nombre de usuario en lugar de e-mail, correo electrónico excluir de la forma. Enmascare su etiqueta como correo electrónico.

  2. Subclase Usuario y crear un campo ÚNICO que reciba direcciones de correo electrónico, enmascararlo como correo electrónico, excluir el campo de correo electrónico original del formulario.

Es así de simple pero me tomó algo de tiempo. Espero que ayude a otros con la misma necesidad.

17

en su __init__.py

from django.contrib.auth.models import User 

User._meta.get_field_by_name('email')[0]._unique = True 
+0

+1 gracias. Voy a probarlo. – Viet

+1

el mono-pathcing es malo, pero contib.auth está tan mal diseñado, que el uso de parches de mono aquí no debería ser ninguna vergüenza. – DataGreed

+0

Solicito una aclaración sobre init.py, por favor. Hay decenas de __init__.py en mi proyecto. ¿Cuál es el que quieres decir? Hmm .. stackoverflow no muestra subrayados, esto confunde ... –

0

Este método no hará que el campo de correo electrónico única a nivel de base de datos, pero vale la pena intentarlo.

Utilice una costumbre validator:

from django.core.exceptions import ValidationError 
from django.contrib.auth.models import User 

def validate_email_unique(value): 
    exists = User.objects.filter(username=value) 
    if exists: 
     raise ValidationError("Email address %s already exits, must be unique" % value) 

Luego, en forms.py:

from django.contrib.auth.models import User 
from django.forms import ModelForm 
from main.validators import validate_email_unique 


class UserForm(ModelForm): 
    #.... 
    email = forms.CharField(required=True, validators=[validate_email_unique]) 
    #.... 
+0

Esta solución tiene un pequeño error ya que UserForm solo se podía usar para crear usuarios. Si lo usó para editar un usuario, "existe" sería cierto, aunque ese sea un resultado esperado. –