J'ai utilisé un formulaire personnalisé pour les utilisateurs du registre. Je veux faire la validation pour confirmer le mot de passe. forms.py:
def registration_view(request):
context = {}
context.update(csrf(request))
context['form'] = RegistrationForm()
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
newuser = auth.authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password2']
)
auth.login(request, newuser)
return redirect('home')
else:
context['form'] = form
return render(request, '/registration.html', context)
template:
<div class="input-group register">
{{ form.password.errors }}
<label for="id_password1">Password: </label>
{{ form.password1 }}
</div>
<div class="input-group register">
{{ form.password.errors }}
<label for="id_password2">Confirm password: </label>
{{ form.password2 }}
</div>
views.py
class RegistrationForm(UserCreationForm):
'''Register for new users'''
email = forms.EmailField(required=True)
first_name = forms.CharField(required=True)
last_name = forms.CharField(required=True)
class Meta:
model = get_user_model()
fields = {'username', 'password1', 'password2', 'email', 'first_name', 'last_name'}
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
if commit:
user.save()
return user
Comment puis-je ajouter la validation du mot de passe (également confirmer le mot de passe)?
3 Réponses :
Je trouve l'erreur
<div class="input-group register">
{{ form.password1.errors }}
<label for="id_password1">ÐаÑолÑ: </label>
{{ form.password1 }}
</div>
<div class="input-group register">
{{ form.password2.errors }}
<label for="id_password2">ÐодÑвеÑдиÑе паÑолÑ: </label>
{{ form.password2 }}
</div>
Vous héritez de UserCreationForm [GitHub] . Ce formulaire le fait déjà pour vous.
En effet: le clean_password2 validera que les deux mots de passe sont identiques:
def registration_view(request): context = {} context.update(csrf(request)) if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): newuser = form.save() auth.login(request, newuser) return redirect('home') else: form = RegistrationForm() context['form'] = form return render(request, '/registration.html', context)blockquote >La fonction
_post_cleanvalidera que le mot de passe est un mot de passe valide:class RegistrationForm(UserCreationForm): '''Register for new users''' email = forms.EmailField(required=True) first_name = forms.CharField(required=True) last_name = forms.CharField(required=True) class Meta: model = get_user_model() fields = ['username', 'email', 'first_name', 'last_name']Enfin dans le save () il utilisera
.set_password ()pour définir le mot de passe. Ceci est nécessaire, car le modèleUserde Django, comme tout bon modèle d'utilisateur, hachera le mot de passe.def save(self, commit=True): user = super().save(commit=False) user.set_password(self.cleaned_data["password1"]) if commit: user.save() return userVous ne devez donc pas interférer avec ceux-ci. Ici, vous ne voulez ajouter que
first_nameetlast_name. Vous pouvez donc ajouter cette logique avec:def _post_clean(self): super()._post_clean() # Validate the password after self.instance is updated with form data # by super(). password = self.cleaned_data.get('password2') if password: try: password_validation.validate_password(password, self.instance) except forms.ValidationError as error: self.add_error('password2', error)C'est tout, puisque le
ModelForms'en chargera.Remarque que
authentifierdans votre vue n'est probablement pas nécessaire, car si vous construisez un utilisateur, il devrait s'authentifier. Vous pouvez simplementvous connecterici:def clean_password2(self): password1 = self.cleaned_data.get("password1") password2 = self.cleaned_data.get("password2") if password1 and password2 and password1 != password2: raise forms.ValidationError( self.error_messages['password_mismatch'], code='password_mismatch', ) return password2
Je vous remercie. J'ai vu cette décision. Et je vais utiliser la validation personnalisée pour le mot de passe
@RustamPulatov: alors je vous suggère de remplacer le _post_clean avec votre propre validation :). Mais vous n'avez probablement pas à réécrire le reste du formulaire :)
Je comprends. Merci beaucoup.
Essayez de l'utiliser dans votre modèle de registre
<form method="post" id="register-account-form">
{% csrf_token %}
{% for field in form %}
{% if field.help_text %}
<div class="notification error closeable">
<small style="color: grey">{{ field.help_text }}</small>
<a class="close" href="#"></a>
</div>
{% endif %}
{% for error in field.errors %}
<div class="notification error closeable">
<p style="color: red">{{ error }}</p>
<a class="close" href="#"></a>
</div>
{% endfor %}
{% endfor %}
<div class="input-with-icon-left">
<i class="icon-feather-user"></i>
{{ form.username }}
</div>
Il s'agit d'un formulaire
UserCreation, ce qui signifie qu'il est déjà implémenté.Oui, j'ai essayé ce formulaire comme {{form}}, mais je ne suis pas satisfait de la vue. Sur mon modèle ne fonctionne pas, comparez deux mots de passe.
Merci, Willem Van Onsem.