Django: comment faire pour vérifier si le nom d'utilisateur existe déjà
je ne suis pas très à l'utilisateur avancé de Django. J'ai vu beaucoup de différentes méthodes en ligne, mais ils sont tous de modifier les modèles ou trop compliqué pour moi à comprendre.
Je suis la réutilisation de la UserCreationForm
dans mon MyRegistrationForm
class MyRegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
def save(self, commit=True):
user = super(MyRegistrationForm, self).save(commit=False)
user.email = self.cleaned_data['email']
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
J'ai du mal à comprendre ou à trouver un moyen de vérifier si le nom d'utilisateur que l'utilisateur entre l'est déjà pris ou pas.
Donc, je viens de l'utiliser pour me diriger vers html où il est dit mauvais nom d'utilisateur ou des mots de passe ne correspondent pas:
def register_user(request):
if request.method == 'POST':
form = MyRegistrationForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/register_success')
else:
return render_to_response('invalid_reg.html')
args = {}
args.update(csrf(request))
args['form'] = MyRegistrationForm()
print args
return render_to_response('register.html', args)
Voici mon enregistrement de modèle(si nécessaire):
{% extends "base.html" %}
{% block content %}
<section>
<h2 style="text-align: center">Register</h2>
<form action="/accounts/register/" method="post">{% csrf_token %}
<ul>
{{form.as_ul}}
</ul>
<input type="submit" value="Register" onclick="validateForm()"/>
</form>
</section>
{% endblock %}
Mais j'ai besoin de rasise une sorte d'exception ou qch comme ça avant que l'utilisateur obtient redirigé. Peut-être que quand l'utilisateur appuie sur enregistrer, il/elle aurait obtenez le message d'erreur/warrning en disant que le nom d'utilisateur est déjà pris? Est-ce possible?
OriginalL'auteur pptt | 2015-04-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser existe:
OriginalL'auteur JuniorCompressor
Vous pouvez vérifier si le
username
existe avec leclean_username
méthode et d'élever ValidationError:Si c'est le cas, vous pouvez afficher les erreur dans le formulaire d'inscription et n'ont pas besoin de rediriger vers une autre page.
mise à jour:
Comme par @Spacedman a souligné un point qui concerne les conditions de concurrence sur la vérification de l'identifiant d'unicité sur la Forme logique contre le niveau de DB, bien que vos chances d'obtenir ce qui est très peu probable, dans le cas où vous n'voici les DONC des réponses qui mérite d'être lu:
Comment éviter condition de course unique avec des contrôles dans Django
Des conditions de course dans django
Une autre mise à jour
Que par des OP commentaire, voici une autre modification peut être faite pour les vues:
Espère que cette aide.
bon point. Mais normalement un
user_model
aura d'autres modèles connexes (commeaddress
etc.) qui, en vertu deform.save()
, leuser_model
peut échouer à créer en raison de dupliquerusername
mais unaddress
enregistrement peut avoir été créé?semble comme il y aura des compromis en termes de propreté de la Forme logique et à composer avec des conditions de course. Pour un trafic de site web, cela ne devrait pas être un problème, mais pour le cas de bord, j'ai mis à jour la réponse à fournir quelques liens utiles comment traiter avec eux (même si je me sens toujours comme il n'y a pas de toute façon la plus propre à atteindre le meilleur des deux). Merci de souligner ce point et j'ai aussi bénéficié de la lecture de ces réponses 🙂
bonjour les gars, j'ai essayé de faire cela pendant des jours, mais je ne peux pas le faire. cela semble impossible. lorsque j'utilise le code u guys suggéré, rien ne change, je suis toujours redirigé vers la page statique où il est dit mauvais nom d'utilisateur ou mot de passe. je veux vraiment apprendre à l'erreur près le champ nom d'utilisateur :((
n'oubliez pas de mettre le
clean_username
bloc de code dans votreMyRegistrationForm
, pas sur affichage. Aussi, votreviews
peut être amélioré, je ne suis pas sûr pourquoi vous avez besoin de mettre à jourcsrf
, il doit être renouvelé par Django. Je vais faire une autre mise à jour de ma réponse pour refléter cela, merci de vérifier et de signaler si cela fonctionne pour vous.OriginalL'auteur Anzel