2016-09-19 15 views
1

Ich habe django allauth für Benutzerregistrierung und Login-System verwendet. Ich könnte das Formular anzeigen, indem ich die Codezeilen mit der for-Schleife vereinfache. Ich habe auch den richtigen Feldtyp (TextInput und PasswordInput) für jedes Feld. Das Passwortfeld mit PasswordInput zeigt jedoch das Passwort im Klartext an. Wie kann ich das lösen?Passwort-Feld zeigt Passwort im Klartext

meine Anmeldeseite (Konto/signup.html)

<form class="signup" id="signup_form" method="post" action="{% url 'account_signup' %}"> 
    {% csrf_token %} 
    {% for field in form.visible_fields %} 
    <div class="form-group"> 
     <label for="{{ field.id_for_label}}">{{field.label}}</label> 
     {{ field.errors.0 }} 
     <input type="{{field|input_type}}" name="{{ field.name }}" class="form-control" id="{{ field.id_for_label}}"> 
    </div> 
    {% endfor %} 
</form> 

filters.py

from django import template 
register = template.Library() 

@register.filter('input_type') 
def input_type(field): 
    print('field',field.field.widget.__class__) 
    return field.field.widget.__class__.__name__ 

Wie ich Passwort in Punkt zeigen können?

+0

können Sie zeigen, was der Druck sagen tut? – sebb

+0

@ SebastianBurzyński Feld Feld Feld Feld Feld milan

+2

Warum verwenden Sie nicht einfach '{{field}}'? –

Antwort

2

Sie können durch zwingende __init__ Methode in Formularklasse Klasse hinzufügen

def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs) 
    self.fields['password'].widget.attrs['class'] = 'form-control' 
1

Das Passwort wird im Klartext zeigt, weil Sie die Zuordnung <input> Typen falsch, daher keine Passwörter als <input type="password"> tut versteckt.

Aus dem Lesen der Kommentare sieht es so aus, als ob Sie benutzerdefinierte benutzerdefinierte Bootstrap-Klassen zu den Formularfeldern hinzufügen möchten. Wie Anna Vracheva sagte, können Sie die Klasse zu den Feldern hinzufügen, indem Sie die Methode __init__ des Formulars verwenden.

from django import forms 

class CustomForm("""Whichever class you're inheriting from, probably ModelForm"""): 
    # If you're using AllAuth, this is already defined on the form 
    password = fields.CharField(widget=forms.PasswordInput) 
    # Or whatever field, for that matter 

    def __init__(self, *args, **kwargs): 
     super(CustomFieldForm, self).__init__(*args, **kwargs) 

     # Option 1 - Assign to only password 
     self.fields['password'].widget['class'] = 'form-control' 

     # Option 2 - Loop over all fields and assign to all 
     for field in self.fields: 
      field.widget['class'] = 'form-control' 

Dann anstatt manuell HTML-Rendering, lassen Djangos Vorlagen tun:

<!-- This --> 
{{ field }} 
<-- --> 
<!-- Instead of this --> 
<input type="{{field|input_type}}" name="{{ field.name }}" 
     class="form-control" id="{{ field.id_for_label}}"> 

, dass jedes Feld beheben sollten Probleme machen Sie mit sind, während die Form Klassen zu erhalten.

0

können Sie auch versuchen, diese:

<input class="form-control" type="{{ field.field.widget.input_type }}" 
        name="{{ field.name }}" 
        id="id_{{ field.name }}" > 
Verwandte Themen