Django, вернуться на предыдущую страницу после отправки формы POST - PullRequest
5 голосов
/ 15 февраля 2012

На моей веб-странице есть форма, которая заполняется данными после некоторых запросов ajax. Например, когда пользователь выбирает элемент из списка, в базу данных отправляется простой запрос ajax о том, что элемент был выбран (но пока не подтвержден). Затем список на веб-странице перезагружается, используя запрос ajax simpe (только список, а не вся страница), чтобы получить новый список элементов.

Мне кажется, это более или менее классическая реализация корзины.

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

Спасибо.

Ответы [ 3 ]

11 голосов
/ 15 февраля 2012

Вы можете указать параметр next GET при отправке формы, аналогично методу login() django.contrib.auth:

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'])
1 голос
/ 16 февраля 2012

Вы можете использовать шаблон Post / Redirect / Get Design (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))

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

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

0 голосов
/ 15 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...