How to redirect to previous page in Django after POST request – Stack Overflow

How to redirect to previous page in django after post request

My favorite way to do that is giving the request.path as GET parameter to the form.
It will pass it when posting until you redirect.
In Class-Based-Views (FormView, UpdateView, DeleteView or CreateView) you can directly use it as success_url.
Somewhere i read that it’s bad practise to mix GET and POST but the simplicity of this makes it to an exception for me.


Example urls.py:

urlpatterns = [
    path('', HomeView.as_view(), name='home'),
    path('user/update/', UserUpdateView.as_view(), name='user_update'),
]

Link to the form inside of the template:

<a href="{% url 'user_update' %}?next={{ request.path }}">Update User</a>

Class-Based-View:

class UserUpdateView(UpdateView):
    ...
    def get_success_url(self):
        return self.request.GET.get('next', reverse('home'))

In your function based view you can use it as follows:

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()
            next = request.GET.get('next', reverse('home'))
            return HttpResponseRedirect(next)

    args = {}
    args.update(csrf(request))
    args['username'] = request.user.username
    args['form'] = AdverForm()
    args['uw'] = uw
    return  render_to_response('createadv.html', args)

Пример

Мы снова предполагаем, что у нас есть приложение Django с файлом с именем views.py и еще один файл с именем urls.py, urls.py файл будет содержать некоторый код Python, например:

Способ django 1.11

Для Django 1.11, выпущенного в апреле 2022 года, LoginView представление на основе классов заменило login() представление на основе функций [2], которое дает вам два варианта на выбор:

  • Используйте то же самое Django 1.10 способ только что описанный ранее, что является положительным моментом, потому что ваш текущий код будет продолжать работать нормально. Если вы укажете интерпретатору Python отображать предупреждения, например, запустив в консольном терминале команду python -Wd manage.py runserver в каталоге проекта Django, а затем перейдя с веб-браузером на страницу входа в систему, вы увидите в том же консольном терминале предупреждающее сообщение, подобное этому:
Похожее:  ALTEL ЛИЧНЫЙ КАБИНЕТ ВХОД ПО НОМЕРУ ТЕЛЕФОНА

/usr/local/lib/python3.6/site-packages/django/contrib/auth/views.py:54: RemovedInDjango21 Предупреждение: представление login () заменяется представлением LoginView () на основе классов.

  • Используйте новый Django 1.11 way, что сделает ваш код более современным и совместимым с будущими выпусками Django. С этой опцией приведенный выше пример теперь будет выглядеть следующим образом:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *