web-dev-qa-db-fra.com

Comment créer un champ de saisie de mot de passe dans Django

Bonjour, j’utilise la classe de modèles Django avec un champ et un champ de mot de passe. Au lieu d’afficher du texte brut ordinaire, je souhaite afficher la saisie du mot de passe. J'ai créé une classe de modèle comme celle-ci:

class UserForm(ModelForm):
    class Meta:
        password = forms.CharField(widget=forms.PasswordInput)
        model = User
        widgets = {
            'password': forms.PasswordInput(),
        }

Mais j'obtiens l'erreur suivante: NameError: le nom 'formes' n'est pas défini. 

J'utilise Django version 1.4.0. J'ai suivi ce lien: Problèmes de mot de passe Django

Toujours avoir la même erreur. Que devrais-je faire. Où est-ce que je me trompe? Merci de l'aide

52
Dar Hamid

Vous devez inclure les éléments suivants dans vos importations.

from Django import forms
55
DrTyrsa

Le widget doit être un appel de fonction, pas une propriété. Il vous manquait une parenthèse.

class UserForm(ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model = User
57
Burhan Khalid

Pourquoi ne pas simplement créer votre propre champ de mot de passe que vous pouvez utiliser dans tous vos modèles.

from Django import forms 

class PasswordField(forms.CharField):
    widget = forms.PasswordInput

class PasswordModelField(models.CharField):

    def formfield(self, **kwargs):
        defaults = {'form_class': PasswordField}
        defaults.update(kwargs)
        return super(PasswordModelField, self).formfield(**defaults)

Alors maintenant, dans votre modèle, vous utilisez

password = PasswordModelField()
15
Karol Jochelson

@DrTyrsa est correct. N'oubliez pas vos parenthèses.

from Django.forms import CharField, Form, PasswordInput

class UserForm(Form):
    password = CharField(widget=PasswordInput())
14
Keith

Je l'ai suivi sans aucune importation supplémentaire

from Django import forms
class Loginform(forms.Form):
    attrs = {
        "type": "password"
    }
    password = forms.CharField(widget=forms.TextInput(attrs=attrs))

L'idée vient du code source: https://docs.djangoproject.com/fr/2.0/_modules/Django/forms/fields/#CharField

3
Te ENe Te

Depuis que cette question a été posée il y a quelques années et qu'elle est bien indexée sur les résultats de recherche, cette réponse pourrait aider certaines personnes venant ici avec le même problème mais utilisant une version plus récente de Django.

J'utilise Django 1.11 mais cela devrait également fonctionner pour Django 2.0.


Compte tenu du fait que vous utilisez un utilisateur de modèle, je supposerai que vous utilisez le modèle User () par défaut de Django.

Puisque le modèle User () a déjà un champ de mot de passe, nous pouvons simplement lui ajouter un widget.

from Django import forms
from Django.contrib.auth.models import User

# also, it will work with a custom user model if needed.
# from .models import User


class UserRegistrationForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ['username', 'password']

        widgets = {
            # telling Django your password field in the mode is a password input on the template
            'password': forms.PasswordInput() 
        }

Vérifiez la documentation

Je suis assez nouveau pour Django, si ma réponse n’est pas assez précise, merci de nous le faire savoir, je me ferai un plaisir de la modifier plus tard.

2
Jesus Lemus

C'est très simple.

Vous devriez obtenir le champ de formulaire password dans la classe Meta.

0
minmaxavg