2011-01-10 17 views
12

Also, gerade jetzt mache ich den grundlegenden Login. In urls.py, gehe ich contrib Jetzt django:Wie erweitere ich das Django "Login" -Formular?

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html'}), 

Das schießt es hier:

@csrf_protect 
@never_cache 
def login(request, template_name='registration/login.html', 
      redirect_field_name=REDIRECT_FIELD_NAME, 
      authentication_form=AuthenticationForm): 

Diese Ansicht verwendet die AuthenticationForm Formen Modell:

class AuthenticationForm(forms.Form): 
    """ 
    Base class for authenticating users. Extend this to get a form that accepts 
    username/password logins. 
    """ 
    username = forms.CharField(label=_("Username"), max_length=30) 
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput) 

So .. mein Ziel ist es, den Benutzernamen zu ändern! Indem Sie das hinzufügen: widget = forms.TextInput(attrs={'placeholder': 'username'}). Das ist es. Das ist alles, was ich dem Benutzernamen-Eingabefeld hinzufügen möchte. Aber ich möchte nicht die tatsächliche django forms.py-Datei ändern, da dies Teil von django contrib ist und ich fühle mich schlecht, diese Datei zu ändern.

Was mache ich? Soll ich ein Formular erstellen, das AuthenticationForm erweitert? Wenn ja, wie importiere ich das? Und wie gebe ich das als Argument über meine urls.py weiter? Ich weiß nicht, was ich machen soll.

Antwort

21

Sie benötigen die AuthenticationForm Klasse, Unterklasse, und dann müssen Sie Ihre urls.py ändern,

class MyAuthenticationForm(AuthenticationForm): 
    # add your form widget here 
    widget = ..... 

Dann diese Klasse importieren in Ihre urls.py Datei und aktualisieren Sie den Anruf,

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html', 'authentication_form':MyAuthenticationForm}), 

I‘ Ich bin zu müde, um die Links auf der Dokumentations-Website nachzuschlagen, um zu sehen, welche Art von Feld Sie verwenden müssen, aber dies sollte den Anfang machen, ohne dass Sie den von Ihnen definierten django forms.py ändern müssen endlich sollte sich schlecht über Änderungen fühlen!

1

Wie milkypostman sagte, müssen Sie eine Unterklasse von auth.forms.AuthenticationForm machen.

Dann können Sie django-crispy-forms verwenden, um die Platzhalter in die gewünschten Felder zu setzen. Es ist so einfach:

(app/forms.py)

class LoginWithPlaceholder(AuthenticationForm): 

    def __init__(self, *args, **kwargs): 
     super(LoginWithPlaceholder, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.form_show_labels = False 
     self.helper.layout = Layout(Div(Field('username', placeholder='username'), css_class="form-group"), 
            Div(Field('password', placeholder='password'), css_class="form-group"), 
            Div(Submit('submit', 'Log in'))) 

Schließlich nicht zu vergessen den knusprigen Tag in Ihrer Vorlage zu verwenden:

<div class="col-sm-6 col-sm-offset-3">   
{% crispy form %}    
</div> 
+0

Vielen Dank für die Zeiger auf knusprig! – rikb