2011-01-10 14 views
12

Quindi, ora sto facendo il login di base. In urls.py, vado a Django contrib login:Come estendere il modulo di "accesso" di Django?

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

che spara a qui:

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

Questo punto di vista utilizza il modello di forme AuthenticationForm:

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) 

Quindi .. il mio obiettivo è quello di cambiare il nome utente! Aggiungendo a questo: widget = forms.TextInput(attrs={'placeholder': 'username'}). Questo è tutto. Questo è tutto ciò che voglio aggiungere alla casella di inserimento del nome utente. Ma, non voglio cambiare il vero file django forms.py, dato che fa parte del contributo di django e mi sento male a cambiare quel file.

Cosa devo fare? Devo creare un modulo che estende AuthenticationForm? Se sì, come posso importarlo? E come posso passarlo come argomento tramite la mia urls.py? Io non so cosa fare.

risposta

21

È necessario creare una sottoclasse della classe AuthenticationForm, e allora avete bisogno di cambiare il vostro urls.py,

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

Poi importare questa classe nel file urls.py e aggiornare la chiamata,

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

I' Sono troppo stanco per cercare i collegamenti sul sito della documentazione per vedere che tipo di campo è necessario utilizzare ma questo dovrebbe fare il trucco per iniziare senza dover modificare il django che si finitamente dovrebbe sentirsi male sul cambiamento!

1

Come indicato da milkypostman, è necessario creare una sottoclasse di auth.forms.AuthenticationForm.

Quindi, è possibile utilizzare i form di django-crispy per inserire i segnaposto nei campi desiderati. E 'semplice come questo:

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

Infine, non dimenticare di usare il tag croccante nel modello:

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

Grazie per il puntatore a croccante! – rikb

Problemi correlati