2010-02-15 6 views
5

Le problème est le modèle d'utilisateur par défaut n'a pas certaines options très utiles données aux champs par exemple unique = Vrai au champ de courrier électronique.Comment remplacer le champ de modèle utilisateur par défaut dans Django?

J'ai lu cette question: Override default User model method, et vérifié Proxy Model concept, mais sans effet.

Au début, j'essayé:

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

qui a donné lieu à:

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

donc la prochaine était:

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) 

et cette "solution" n'a pas d'effet du tout. Le modèle d'utilisateur par défaut se comportait comme avant.

Je suis intéressé par une solution non-monkey-patching seulement.

Édition: Ok. Singe-patching est acceptable pour moi, mais comment faire cela raisonnablement? (Je veux dire ne change pas le fichier qui se trouve dans /usr/pyshared/python2.6/...)

+0

Ah, allez ... juste un petit peu d'affaire de singe? :-) Malheureusement je ne pense pas que tu vas trouver ce que tu veux vraiment. * Tout le monde * veut modifier le modèle User d'une manière ou d'une autre, mais vous avez découvert que les classes de la base de données Django ne sont pas des classes Python, en particulier en ce qui concerne les champs prioritaires dans le parent. http://docs.djangoproject.com/fr/dev/topics/db/models/#field-name-hiding-is-not-permitted –

+0

Le patch de singe serait assez bon si le langage lui-même le supporte en interne ;-) Les classes de Ruby sont ouvertes, donc vous pouvez changer l'implémentation des classes, même intégrées, lors de l'exécution, ainsi le modèle User pourrait être modifié en Ruby en 3 lignes maximum. En tout cas, merci pour votre réponse. Savez-vous comment faire ce patch-singe raisonnable? –

Répondre

3

Il y a déjà demandé ce ... How to make email field unique in model User from contrib.auth in Django

également la méthode de django des données d'utilisateur supplémentaire est ici http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles.

Je ne suis pas entièrement un fan de cette méthode et j'apprécie d'où vous venez, mais parfois vous devez aller avec le troupeau.

+0

Merci pour votre réponse. Tout d'abord, je cherche un moyen d'ajouter au modèle d'utilisateur non seulement la validation de l'unicité du champ email. Solution d'écriture propre formulaire qui vérifie l'unicité d'un e-mail est celui que je veux éviter (premier lien). Pourquoi? Je pense que le meilleur moyen est d'ajouter une validation plus profonde. D'un autre côté, je peux ajouter un champ email au modèle UserProfile, mais cela double les informations dans DB. * soupir * Mais je pense que je vais coller la méthode de validation de formulaire. –

Questions connexes