7
votes

Faire des champs de messagerie uniques avec l'utilisateur de Django

Il y avait une question presque similaire: Comment créer un champ de messagerie unique dans un utilisateur modèle à partir de contrib.Auth à Django

La solution n'était pas parfaite: Validation du courrier électronique pour l'unicité. La solution fournie est plutôt drôle. Il désactive des modifications à l'utilisateur qui laissent l'e-mail intact. Comment le réparer? Merci d'avance!


7 commentaires

Laquelle des solutions proposées parlez-vous? la solution acceptée?


J'ai répondu dans l'autre question. Je pense que celui-ci devrait être fermé car il s'agit d'une duplication complète.


Lequel? Êtes-vous sûr que cette question et votre réponse répondent à mes exigences? Merci.


J'ai édité Stackoverflow.com/questions/1160030/... et je pense que cela répond maintenant à vos exigences.


+1 merci! Vous avez obtenu mon vote deux fois =) J'ai peut-être besoin d'un livre sur Django. Il y a peu de détails que je manque.


BTW, j'ai exclu le nom d'utilisateur du Modelform. Comment faire alors?


Qui a vanté celui-ci sans explication ???? La question a été 1 an et 8 mois sans problème !!!


3 Réponses :


2
votes

Merci à Ofri Raviv, mais ce que j'ai vu n'est pas ce dont j'avais besoin. J'ai donc résolu mon propre problème et je voudrais maintenant partager les conseils:

  1. Utilisez Nom d'utilisateur au lieu de courriel, excluez le courrier électronique du formulaire. Masque son étiquette comme email.

  2. Utilisateur de sous-classe et créez un champ unique qui reçoit des adresses électroniques, masquez-la en tant que courrier électronique, excluez le champ Email d'origine à partir du formulaire.

    C'est ce simple mais m'a pris un peu de temps. J'espère que cela aident les autres avec le même besoin.


0 commentaires

17
votes

dans votre __ init __. py xxx


5 commentaires

Monkey-Patching est mauvais, mais contributions.Auth est tellement conçue, que l'utilisation de singe-patching ici ne devrait pas être sans honte.


Je demande des éclaircissements sur Init.py, s'il vous plaît. Il y a des dizaines de init .PY dans mon projet. Lequel est celui que vous voulez dire? Hmm .. Stackoverflow ne montre pas les soulignements, cette confusion ...


En fait, chaque init py va faire. Mais je recommanderais celui situé dans le dir racine.


+1 merci, mais dans init .py, j'ai eu cette erreur: ApprentityNotreReady ("Les modèles ne sont pas encore chargés.") ... J'ai essayé d'ajouter ce code dans wsgi.py et maintenant ça marche. Django == 1.7.1 :)


Merci, mais j'avais cette erreur: attributError: 'Options' Object n'a aucun attribut 'get_field_by_name' ... Je change la deuxième ligne vers user._meta.get_field ("email"). _unique = true et maintenant ça marche. Django == 1.10.4



0
votes

Cette méthode ne fera pas de champ de messagerie unique au niveau de la base de données, mais cela vaut la peine d'essayer.

Utilisez une personnalisation validator : p> xxx pré>

puis dans formulaires.pya:

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])
    #....


1 commentaires

Cette solution est un peu imparfaite dans cet userForm ne peut être utilisée que pour créer des utilisateurs. Si vous l'utilisiez pour modifier un utilisateur, "existe" serait vrai même si c'est un résultat attendu.