2012-02-15 22 views
5

Nella mia pagina web ho un modulo che viene riempito con i dati dopo alcune richieste Ajax. Ad esempio, quando un utente sceglie un elemento dall'elenco, viene inviata al database una semplice richiesta Ajax che l'elemento è stato selezionato (ma non ancora confermato). Quindi l'elenco sulla pagina Web viene ricaricato utilizzando una richiesta sime ajax (solo l'elenco, non l'intera pagina) per recuperare il nuovo elenco di elementi.django, tornare alla pagina precedente dopo il modulo POST inviare

Penso che questa sia più o meno una classica implementazione del carrello.

Tuttavia, quando l'utente preme invia (form di tipo POST classico, non ajax POST per alcuni motivi relativi all'implementazione) per confermare l'intera lista, vorrei tornare alla pagina corrente. (La pagina corrente varia) È possibile? Sto usando Django.

Grazie.

risposta

11

È possibile fornire un parametro next ottenere quando l'invio del modulo, simile a quella di django.contrib.auth login() metodo:

https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login:

<form action="/url/to/post/form/?next={{ some_variable }}"> 

in cui la variabile può essere semplicemente l'URL corrente (presa dalla richiesta) o un URL generato. Nella vista l'elaborazione del modulo, è sufficiente verificare la presenza di un parametro next e reindirizzare in modo appropriato:

from django.shortcuts import redirect 
if 'next' in request.GET: 
    return redirect(request.GET['next']) 
0

La pagina corrente è un termine molto vago, ma presumo che si desideri che la pagina che rimanda alla pagina del modulo sia normalmente (non sempre) memorizzata nell'intestazione HTTP_REFERRER della richiesta stessa. Potresti provare a recuperarlo dalla richiesta e fare un reindirizzamento.

+0

Grazie mille. Dici "non sempre", perché è così? – xpanta

+2

È compito del browser dell'utente inviare il referrer. Alcuni browser non hanno, o hanno un'opzione per disabilitarlo - in particolare, Opera. Un'altra correzione potrebbe essere quella di includere il percorso corrente come input nascosto nei moduli e cercare quel valore in 'request.POST'. – AdamKG

1

si può essere in grado di utilizzare il/Redirect/Get modello Design Post (PRG). Per ulteriori informazioni generali su Post/Redirect/Get, vedere quanto segue: http://en.wikipedia.org/wiki/Post/Redirect/Get Ci sono alcuni diagrammi di flusso del processo.

Un esempio generico di una visione attuazione PRG potrebbe essere simile al seguente:

# urls.py 
urlpatterns = patterns('', 
    url(r'^/$', views.my_view, name='named_url'), 
) 

# forms.py 
class MyForm(forms.Form): 
    pass # the form 

# views.py 
def my_view(request, template_name='template.html'): 
    """ Example PostRedirectGet 
    This example uses a request context, but isn't 
    necessary for the PRG 
    """ 
    if request.POST: 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      try: 
       form.save() 
       # on success, the request is redirected as a GET 
       return HttpResponseRedirect(reverse('named_url')) 
      except: 
       pass # handling can go here 
    else: 
     form = MyForm() 

    return render_to_response(template_name, { 
     'form':form 
    }, context_instance=RequestContext(request)) 

Se avete bisogno di fare qualcosa di più interessante con il GET, reverse può prendere args e kwargs. Manipola i parametri della vista, url_pattern e inversa per visualizzare i risultati che desideri vedere.

Una nota aggiuntiva è che non è necessario reindirizzare alla stessa vista (come in questo esempio). Potrebbe essere una vista con nome a cui desideri reindirizzare l'utente.

Problemi correlati