2014-09-01 14 views
5

Ho già eseguito l'override del modulo di registrazione con la semplice variabile delle impostazioni ACCOUNT_SIGNUP_FORM_CLASS ma per sovrascrivere il modulo di accesso è necessario utilizzare ACCOUNT_FORMS = {'login': 'yourapp.forms.LoginForm'}. Ho la forma che voglio e visualizza perfettamente con croccanti forme e Bootstrap3:Overriding del modulo di login di Django allauth con ACCOUNT_FORMS

class LoginForm(forms.Form): 
    login = forms.EmailField(required = True) 
    password = forms.CharField(widget = forms.PasswordInput, required = True) 

    helper = FormHelper() 
    helper.form_show_labels = False 
    helper.layout = Layout(
     Field('login', placeholder = 'Email address'), 
     Field('password', placeholder = 'Password'), 
     FormActions(
      Submit('submit', 'Log me in to Cornell Forum', css_class = 'btn-primary') 
     ), 
    ) 

Quando presento la forma ottengo AttributeError at /account/login/ - 'LoginForm' object has no attribute 'login'. Cosa c'è che non va qui? La sorgente del modulo di login allauth originale è qui: https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py

+0

la documentazione per allauth sono qui mostrano l'impostazione: http://django-allauth.readthedocs.org/en/latest/configuration.html – wnajar

risposta

7

Dalla mia comprensione, è possibile sovrascrivere il LoginForm predefinito utilizzando ACCOUNT_FORMS, ma è necessario fornire una classe che contiene tutti i metodi forniti nella classe originale. Nella tua classe manca il metodo login.

vorrei impostare ACCOUNT_FORMS = {'login': 'yourapp.forms.YourLoginForm'} nel file settings.py, dove YourLoginForm eredita dalla classe originale.

# yourapp/forms.py 

from allauth.account.forms import LoginForm 

class YourLoginForm(LoginForm): 
    def __init__(self, *args, **kwargs): 
     super(YourLoginForm, self).__init__(*args, **kwargs) 
     self.fields['password'].widget = forms.PasswordInput() 

     # You don't want the `remember` field? 
     if 'remember' in self.fields.keys(): 
      del self.fields['remember'] 

     helper = FormHelper() 
     helper.form_show_labels = False 
     helper.layout = Layout(
      Field('login', placeholder = 'Email address'), 
      Field('password', placeholder = 'Password'), 
      FormActions(
       Submit('submit', 'Log me in to Cornell Forum', css_class = 'btn-primary') 
      ), 
     ) 
     self.helper = helper 
+0

Questo è in sostanza quello che ho fatto, ma è un incubo/a percorso non vale la pena scendere perché è necessario copiare essenzialmente l'intera, complicata classe 'LoginForm'. Non è molto estensibile e non documentato. Alla fine ho abbandonato Django e ho finito l'app con Laravel .. la migliore decisione che ho preso. – wnajar

+0

FYI a chiunque stia leggendo questo, questa soluzione ha funzionato bene per me senza dover copiare qualcos'altro. Ha funzionato perfettamente – awwester

+0

Continuo a ricevere le importazioni circolari in questo modo – guival

Problemi correlati