10

Ho un progetto in cui ho bisogno di pop una finestra modale per gli utenti non autenticati.Django - Ajax accesso/registrazione modale

Questa modal consente di accedere direttamente a o creare un account.

Così conterrà due forme:

  • django.contrib.auth.forms.AuthenticationForm
  • registration.forms.RegistrationForm

Modal tabbed forms

Qui è la mia opinione per ottenere entrambe le forme:

def ajax_registration(request): 
    obj = { 
     'login_form': AuthenticationForm(), 
     'registration_form': RegistrationForm(), 
    } 
    return render(request, 'common/ajax_registration.html', obj) 

E il mio modello di visualizzazione delle forme a schede

<ul class="nav nav-tabs"> 
    <li><a href="#tab1" data-toggle="tab">{% trans 'Login' %}</a></li> 
    <li><a href="#tab2" data-toggle="tab">{% trans 'Registration' %}</a></li> 
</ul> 
<div class="tab-content"> 
    <div class="tab-pane active" id="tab1"> 
    {{ login_form|bootstrap }} 
    </div> 
    <div class="tab-pane" id="tab2"> 
    {{ registration_form|bootstrap }} 
    </div> 
</div> 

domanda è: Dal momento che sto utilizzando AJAX per visualizzare questo modale, come posso convalidare il modulo selezionato, preferibilmente utilizzando i già scritto django-registrations register & django.contrib.auth login vista?

+1

hai implementato con successo? Potresti condividere questo pezzo di codice ovunque su github? Sarà bello punto culminante :-) – andi

+2

Buona idea. Ho solo alcuni problemi con la registrazione ajax. Inserirò i miei file su github (non so come impacchettarli) –

+1

[qui] (https://github.com/Glideh/django-ajax-login). Qualsiasi miglioramento è molto apprezzato. –

risposta

5

In aggiunta alla risposta di Maddog, è necessario un po 'di javascript per inviare il modulo all'URL che ha reso il modulo. Utilizzando jQuery potrebbe essere qualcosa di simile:

$('form').submit(function(e){ 
     e.preventDefault(); 
     var form = $(e.target); 

     $.ajax({ 
      url: '{% url YOUR_REGISTRATION_URL %}', 
      type: 'post', 
      data: account_form.serialize() + '&' + form.serialize(), 
      error: function(xhr, ajaxOptions, thrownError){ alert(thrownError); }, 
      success: function(){} 
     }) 
}) 

Non è necessario farlo con una forma presentare elemento, è possibile utilizzare qualsiasi elemento con $() clicca(), naturalmente..

+1

Grazie. In realtà so come gestire la parte Javascript. Ho menzionato ajax solo per specificare il contesto che alla fine coinvolgerà alcune risposte json o html. –

+0

Sto cercando in modo più specifico come processare entrambi i form usando ['registro di registri django'] (http://docs.b-list.org/django-registration/0.8/views.html#registration.views.register) & ['django.contrib.auth login'] (https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login) visualizza –

+1

ok, capisco. Quindi hai bisogno del loro registration.views.register se è un nuovo utente e django.contrib.auth.views.login se è una registrazione già creata?Non dovresti usare queste due viste direttamente invece di usare i moduli? –

1

Qualcosa di simile?

def ajax_registration(request): 
    login_form, registration_form = False, False 
    if request.method == "POST": 
     if "email" in request.POST: # some condition to distinguish between login and registration form 
      login_form = AuthenticationForm(request.POST) 
      if login_form.is_valid(): 
       # log in 
     else: 
      registration_form = RegistrationForm(request.POST) 
      if registration_form.is_valid(): 
       # register 

    obj = { 
     'login_form': login_form if login_form else AuthenticationForm(), 
     'registration_form': registration_form if registration_form else RegistrationForm(), 
    } 
    return render(request, 'common/ajax_registration.html', obj) 
+0

Grazie per la risposta. 2 problemi qui: 1 - se l'utente riempie l'e-mail e alla fine vuole accedere direttamente, si romperà (quindi deve prendere la scheda selezionata, eseguirò un JS aggiornando un input nascosto per quello). 2 - C'è un modo per accedere alle viste di registrazione esistenti al fine di sfruttare i meccanismi già implementati? –

+0

1. - sicuro dall '"email" in .. "Intendevo solo una condizione per distinguere tra quelle 2 forme 2. - quale vista hai in mente? Ho pensato che volessi effettuare la registrazione/login sullo sfondo usando qualche API di autenticazione ... beh io non conosco questa app troppo bene, quindi non posso fermarti con questo molto – Maddog

+0

Sto provando a fare qualcosa simile inviando i moduli di registrazione di django via ajax, ma sto ottenendo un 403. Qualcuno è riuscito a elaborare le forme? – lorenag83

Problemi correlati