2016-03-04 31 views
11

Mi trovo ad affrontare un problema per il quale non riesco a trovare una soluzione. Ho un pulsante in navbar che è disponibile su tutte le pagine ed è un pulsante responsabile della creazione di alcuni contenuti.Come reindirizzare alla pagina precedente in Django dopo la richiesta POST

View che collega con il tasto:

def createadv(request): 
    uw = getuw(request.user.username) 
    if request.method =='POST': 
    form = AdverForm(request.POST, request.FILES) 
    if form.is_valid(): 
     form.instance.user = request.user 
     form.save() 
     return HttpResponseRedirect('/', {'username': request.user.username, 'uw': uw}) 
    args = {} 
    args.update(csrf(request)) 
    args['username'] = request.user.username 
    args['form'] = AdverForm() 
    args['uw'] = uw 
    return render_to_response('createadv.html', args) 

Se si può vedere ora ho sempre reindirizzare alla pagina principale '/' dopo la creazione di contenuti, ma io voglio tornare alla pagina con la quale ho lanciato la creazione di soddisfare.

risposta

19

È possibile aggiungere un campo next al modulo e impostarlo su request.path. Dopo aver elaborato il modulo, è possibile reindirizzare al valore di questo percorso.

template.html

<form method="POST"> 
    {% csrf_token %} 
    {{ form }} 
    <input type="hidden" name="next" value="{{ request.path }}"> 
    <button type="submit">Let's Go</button> 
</form> 

views.py

next = request.POST.get('next', '/') 
return HttpResponseRedirect(next) 

Questo è più o meno ciò che django.contrib.auth fa per il modulo di login, se ricordo bene.

Se si passa attraverso una pagina intermedia, è possibile passare il valore 'prossimo' tramite querystring:

some_page.html

<a href="{% url 'your_form_view' %}?next={{ request.path|urlencode }}">Go to my form!</a> 

template.html

<form method="POST"> 
    {% csrf_token %} 
    {{ form }} 
    <input type="hidden" name="next" value="{{ request.GET.next }}"> 
    <button type="submit">Let's Go</button> 
</form> 
3

È possibile utilizzare il valore HTTP_REFERER:

return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) 

Si noti che questo non funzionerà se il cliente disabile l'invio di informazioni di provenienza (ad esempio, utilizzando una finestra del browser privato/incognito). In tal caso, reindirizzerà a /.

+0

aggiungo richiesta .META.get ('HTTP_REFERER', '/') in HttpResponseRedirect, ma sfortunatamente non ha aiutato. In questo caso, dopo invio rimango sulla pagina "createadv". – Oleg

+0

Si potrebbe avere un reindirizzamento extra in mezzo. Assicurati di avere la barra finale nel tag 'form action =" ... "', ad esempio 'action ="/createadv/"'. – Selcuk

+0

Quando esegui il POST di un modulo, il tuo 'HTTP_REFERER' sarà la pagina da cui hai inviato il modulo, che in realtà è la stessa pagina in questo caso. –

Problemi correlati