2011-01-10 43 views
12

Entonces, ahora estoy haciendo el inicio de sesión básico. En urls.py, voy a django contrib entrada:¿Cómo extiendo el formulario de "inicio de sesión" de Django?

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

que dispara a aquí:

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

Ese punto de vista utiliza el modelo de formas 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) 

Así que .. .mi objetivo es cambiar el formulario de nombre de usuario! Agregando esto a él: widget = forms.TextInput(attrs={'placeholder': 'username'}). Eso es. Eso es todo lo que quiero agregar al cuadro de entrada de nombre de usuario. Pero no quiero cambiar el archivo real django forms.py, ya que eso es parte de django contrib y me siento mal al cambiar ese archivo.

¿Qué debo hacer? ¿Debo crear un formulario que amplíe AuthenticationForm? Si es así, ¿cómo lo importo? ¿Y cómo paso eso como argumento a través de mi urls.py? No se que hacer.

Respuesta

21

Necesitas subclase de la clase AuthenticationForm, y entonces usted necesita para cambiar su urls.py,

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

Entonces importar esta clase en el archivo de urls.py y actualizar la llamada,

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

I' Estoy demasiado cansado para buscar los enlaces en el sitio de documentación para ver qué tipo de campo necesita usar, pero esto debería ser el truco para comenzar sin tener que modificar el django forms.py que usted finito debería se siente mal sobre el cambio!

1

Como milkypostman dijo, necesita hacer una subclase de auth.forms.AuthenticationForm.

Luego, puede usar django-crispy-forms para poner los marcadores de posición en los campos que desee. Es tan simple como esto:

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

Por último, no se olvide de utilizar la etiqueta crujiente en su plantilla:

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

Gracias por la puntero a crujiente! – rikb

Cuestiones relacionadas