Атрибут success_url

Атрибут success_url используется в классе FormView для указания URL-адреса, на который будет перенаправлен пользователь после успешной обработки данных формы. Этот атрибут обязателен для классов, наследующих от FormView, если метод FormView/method/get_success_url/">get_success_url не переопределен. Значение атрибута может быть задано как строка с относительным или абсолютным путем, либо как имя URL-шаблона для использования с reverse_lazy.

Синтаксис

pythonclass MyFormView(FormView):
  form_class = MyForm
  template_name = 'my_template.html'
  success_url = '/success-url/'

Пример . Использование строки URL

Давайте создадим представление, которое после успешной отправки формы перенаправляет пользователя на страницу с благодарностью:

pythonfrom django.views.generic.edit import FormView
from django import forms

class ContactForm(forms.Form):
  name = forms.CharField(max_length=100)
  email = forms.EmailField()
  message = forms.CharField(widget=forms.Textarea)

class ContactFormView(FormView):
  form_class = ContactForm
  template_name = 'contact.html'
  success_url = '/thank-you/'

  def form_valid(self, form):
    # Обработка данных формы
    return super().form_valid(form)

Результат выполнения кода:

python"Redirects to: /thank-you/"

Пример . Использование reverse_lazy

Вместо жесткой строки URL лучше использовать функцию reverse_lazy для динамического построения URL по имени маршрута:

pythonfrom django.views.generic.edit import FormView
from django.urls import reverse_lazy
from django import forms

class SubscribeForm(forms.Form):
  email = forms.EmailField()

class SubscribeFormView(FormView):
  form_class = SubscribeForm
  template_name = 'subscribe.html'
  success_url = reverse_lazy('thanks')

  def form_valid(self, form):
    # Сохранение подписчика
    return super().form_valid(form)

Результат выполнения кода:

python"Redirects to: /thanks/"

Динамическое определение success_url

Для более гибкой логики можно переопределить метод get_success_url, который возвращает URL для перенаправления:

pythonfrom django.views.generic.edit import FormView
from django.urls import reverse_lazy
from django import forms

class FeedbackForm(forms.Form):
  rating = forms.IntegerField(min_value=1, max_value=5)
  comment = forms.CharField(widget=forms.Textarea)

class FeedbackFormView(FormView):
  form_class = FeedbackForm
  template_name = 'feedback.html'
  success_url = reverse_lazy('feedback-success')

  def get_success_url(self):
    # Динамическое определение URL
    if self.request.user.is_authenticated:
      return reverse_lazy('user-dashboard')
    return super().get_success_url()

  def form_valid(self, form):
    # Обработка отзыва
    return super().form_valid(form)

Результат выполнения кода:

python"Redirects to: /dashboard/ (для авторизованных) или /feedback-success/ (для анонимов)"

Смотрите также

  • атрибут form_class,
    который определяет класс формы для отображения
  • метод form_valid,
    который вызывается при успешной валидации формы
  • метод get_success_url,
    который используется для динамического определения URL
  • функция reverse_lazy,
    которая используется для отложенного построения URL