2012-02-15 4 views
5

На моей веб-странице У меня есть форма, заполняемая данными после некоторых запросов ajax. Например, когда пользователь выбирает элемент из списка, в базу данных отправляется простой запрос ajax, который был выбран (но еще не подтвержден). Затем список на веб-странице перезагружается с использованием запроса apex ajax (только списка, а не всей страницы) для выбора нового списка элементов.django, возврат на предыдущую страницу после формы POST submit

Я думаю, что это более или менее классическая реализация корзины.

Однако, когда пользователь нажимает submit (классическая форма POST submit, а не ajax POST по некоторым причинам, касающимся реализации), чтобы подтвердить весь список, я хотел бы вернуться на текущую страницу. (Текущая страница меняется) Возможно ли это? Я использую django.

Спасибо.

ответ

11

Вы можете поставить параметр на next GET при отправке формы, похожие на django.contrib.auth-х login() метод:

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

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

, где переменная может быть просто текущий URL (взятый из запроса) или сгенерированный URL. По мнению обработки формы, просто проверьте параметр next и перенаправлять соответствующим образ:

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

Текущая страница - очень неопределенный термин, но я предполагаю, что вы хотите, чтобы страница, которая ссылалась на страницу формы, обычно (не всегда) хранится в заголовке HTTP_REFERRER самого запроса. Вы можете попробовать получить это из запроса и сделать перенаправление.

+0

спасибо. Вы говорите «не всегда», почему? – xpanta

+2

Это зависит от браузера пользователя, отправляющего реферер. В некоторых браузерах нет или есть возможность отключить его, особенно Opera. Другим решением может быть включение текущего пути в качестве скрытого ввода в формы и поиск этого значения в 'request.POST'. – AdamKG

1

Вы можете быть в состоянии использовать Post/Redirect/Get Design Pattern (PRG). Для получения более общей информации о Post/Redirect/Get см. Следующее: http://en.wikipedia.org/wiki/Post/Redirect/Get Есть несколько хороших диаграмм технологического процесса.

Общий пример вида реализующего PRG может выглядеть следующим образом:

# 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)) 

Если вам нужно сделать что-то более интересное с ГЭТ, reverse может принять арг и kwargs. Управляйте параметрами вида, url_pattern и обратным вызовом, чтобы отобразить результаты, которые вы хотели бы видеть.

Еще одно примечание: вам не нужно перенаправлять на тот же вид (как показано в этом примере). Это может быть любой именованный вид, к которому вы хотите перенаправить пользователя.

Смежные вопросы