web-dev-qa-db-ger.com

So erstellen Sie ein Kennworteingabefeld in Django

Hallo, ich benutze die Django-Modellklasse mit einigen Feldern und einem Kennwortfeld. Anstelle von normalem Klartext möchte ich die Passworteingabe anzeigen. Ich habe eine Modellklasse wie diese erstellt:

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

Ich erhalte jedoch die folgende Fehlermeldung: NameError: Name 'Forms' ist nicht definiert. 

Ich benutze Django Version 1.4.0. Ich folgte diesem Link: Django Passwortprobleme

Immer noch der gleiche Fehler. Was soll ich machen. Wo bin ich falsch? Bitte helfen

52
Dar Hamid

Sie müssen Folgendes in Ihre Importe aufnehmen:

from Django import forms
55
DrTyrsa

Das Widget muss ein Funktionsaufruf sein, keine Eigenschaft. Ihnen fehlten Klammern.

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

Warum erstellen Sie nicht einfach ein eigenes Kennwortfeld, das Sie in allen Ihren Modellen verwenden können.

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)

Also jetzt in deinem Modell verwenden

password = PasswordModelField()
15
Karol Jochelson

@ DrTyrsa ist richtig. Vergessen Sie Ihre Klammern nicht.

from Django.forms import CharField, Form, PasswordInput

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

Ich habe als Folge ohne zusätzlichen Import getan

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

Die Idee kommt aus dem Quellcode: https://docs.djangoproject.com/de/2.0/_modules/Django/forms/fields/#CharField

3
Te ENe Te

Da diese Frage vor ein paar Jahren gestellt wurde und die Suchergebnisse gut indiziert sind, kann diese Antwort einigen Leuten helfen, die mit demselben Problem hierher kommen, aber eine neuere Django-Version verwenden.

Ich benutze Django 1.11, aber es sollte auch für Django 2.0 funktionieren.


Unter Berücksichtigung der Tatsache, dass Sie einen Modellbenutzer verwenden, gehe ich davon aus, dass Sie das Standardbenutzermodell () von Django verwenden.

Da das User () - Modell bereits ein Kennwortfeld hat, können wir einfach ein Widget hinzufügen.

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() 
        }

Überprüfen Sie die Dokumente

Ich bin ziemlich neu in Django. Wenn meine Antwort nicht genau genug war, lass es uns wissen, ich würde es gerne später bearbeiten.

2
Jesus Lemus

Was vom OP bei password = forms.Charfield(widget=forms.PasswordInput) geschrieben wurde, war korrekt. Es gehört einfach nicht in den Abschnitt class Meta:. Stattdessen sollte es darüber liegen und eine Ebene darunter eingerückt sein class UserForm ....

0
Fr George

Es ist sehr einfach.

Sie sollten das password-Formularfeld aus der Meta-Klasse abrufen.

0
minmaxavg