2010-02-15 15 views
5

El problema es que el modelo de usuario predeterminado no tiene algunas opciones muy útiles dadas a los campos, por ejemplo, unique = True al campo de correo electrónico.¿Cómo sobrescribir el campo de modelo de usuario predeterminado en Django?

Leí esta pregunta: Override default User model method, y revisé Proxy Model concepto, pero sin ningún efecto.

Al principio intentado:

from django.contrib.auth import models 
class User(models.User): 
    class Meta: 
     proxy = True 
    email = EmailField('e-mail address', unique=True, blank=False) 

que se tradujo en:

django.core.exceptions.FieldError: Proxy model 'User' contains model fields. 

así que la próxima era:

from django.contrib.auth import models 
class User(models.User): 
    class Meta: 
     proxy = True 
    models.User.email = EmailField('e-mail address', unique=True, blank=False) 

y esta "solución" no tiene ningún efecto en absoluto. El modelo de usuario predeterminado se comportaba igual que antes.

Estoy interesado en la solución de parche que no es de mono.

Editar: Ok. Monkey-patching es aceptable para mí, pero ¿cómo hacer esto razonablemente? (I no significa cambiar el archivo que se encuentra en /usr/pyshared/python2.6/...)

+0

Ah, vamos ... solo un * pequeño * bit of monkey business? :-) Lamentablemente, no creo que vayas a encontrar lo que realmente quieres. * Todo el mundo * quiere modificar el modelo de Usuario de una forma u otra, pero ha descubierto que las "clases" de la base de datos Django son * no * clases de Python, particularmente con respecto a la anulación de campos en el elemento primario. http://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted –

+0

El parche de mono sería lo suficientemente bueno si el lenguaje en sí lo admite internamente ;-) Por ejemplo las clases en Ruby están abiertas, por lo que puedes cambiar la implementación de las clases, incluso las incorporadas, en tiempo de ejecución, por lo que el modelo de usuario podría modificarse en Ruby en un máximo de 3 líneas. De todos modos, gracias por su respuesta. ¿Sabes cómo hacer que este parche de mono sea razonable? –

Respuesta

3

Hay que esto ya pidió ... How to make email field unique in model User from contrib.auth in Django

también el método de Django de los datos de usuario adicional es aquí http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles.

No soy del todo admirador de este método y aprecio de dónde vienes, pero a veces tienes que ir con la manada.

+0

Gracias por su respuesta. En primer lugar, estoy buscando una manera de agregar al modelo de usuario no solo validación de unicidad de campo de correo electrónico. La solución de escribir un formulario propio que verifique la unicidad de un correo electrónico es esa que quiero evitar (primer enlace). ¿Por qué? Creo que la mejor manera es agregar una validación más profunda. Por otro lado, puedo agregar un campo de correo electrónico al modelo de perfil de usuario, pero esto duplica la información en DB. * suspiro * Pero creo que voy a pegar el método de validación de formulario. –

Cuestiones relacionadas