Метод get_success_url
Метод get_success_url применяется к классу FormView и его наследникам. Он определяет, на какой URL будет перенаправлен пользователь после успешной отправки и валидации формы. Метод может возвращать строку с относительным или абсолютным адресом, либо результат вызова функции reverse или reverse_lazy. По умолчанию он возвращает значение атрибута FormView/attribute/success_url/">success_url, если он задан.
Синтаксис
class MyFormView(FormView):
success_url = '/success/'
def get_success_url(self):
return super().get_success_url() # Или кастомная логика
Пример
Простой пример использования метода get_success_url с явным указанием URL:
from django.views.generic.edit import FormView
from myapp.forms import ContactForm
class ContactFormView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = '/thanks/'
def get_success_url(self):
# Можно вернуть строку напрямую
return '/thanks/'
Пример
Использование функции reverse_lazy для динамического построения URL по имени маршрута:
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from myapp.forms import ContactForm
class ContactFormView(FormView):
template_name = 'contact.html'
form_class = ContactForm
def get_success_url(self):
# reverse_lazy используется для отложенного построения URL
return reverse_lazy('main:thanks')
Пример
Переопределение get_success_url с использованием данных из формы для создания персонализированного URL:
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from myapp.forms import UserProfileForm
class UserProfileFormView(FormView):
template_name = 'profile_form.html'
form_class = UserProfileForm
def get_success_url(self):
# Получаем данные формы после валидации
clean_data = self.request.POST
username = clean_data.get('username')
# Формируем URL с параметром
return reverse_lazy('profile_detail', kwargs={'username': username})
Пример
Кастомный метод get_success_url с проверкой, сохраненной в сессии, для перенаправления на предыдущую страницу:
from django.views.generic.edit import FormView
from django.shortcuts import redirect
from django.urls import reverse
from myapp.forms import CommentForm
class CommentFormView(FormView):
template_name = 'add_comment.html'
form_class = CommentForm
def get_success_url(self):
# Получаем URL из сессии или HTTP_REFERER
next_url = self.request.session.get('next_url')
if next_url:
# Удаляем после использования
del self.request.session['next_url']
return next_url
# Иначе стандартный URL
return reverse('comment_list')
Смотрите также
-
атрибут
success_url,
который задает URL перенаправления по умолчанию -
метод
form_valid,
который вызывается при успешной валидации формы -
функция
reverse_lazy,
которая используется для отложенного разрешения URL -
класс
RedirectView,
который используется для простых перенаправлений