Атрибут success_url
Атрибут success_url используется в классе FormView
для указания URL-адреса, на который будет перенаправлен пользователь
после успешной обработки данных формы. Этот атрибут обязателен
для классов, наследующих от FormView, если метод
FormView/method/get_success_url/">get_success_url не переопределен. Значение атрибута
может быть задано как строка с относительным или абсолютным
путем, либо как имя URL-шаблона для использования с
reverse_lazy.
Синтаксис
class MyFormView(FormView):
form_class = MyForm
template_name = 'my_template.html'
success_url = '/success-url/'
Пример . Использование строки URL
Давайте создадим представление, которое после успешной отправки формы перенаправляет пользователя на страницу с благодарностью:
from 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)
Результат выполнения кода:
"Redirects to: /thank-you/"
Пример . Использование reverse_lazy
Вместо жесткой строки URL лучше использовать функцию
reverse_lazy для динамического построения URL
по имени маршрута:
from 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)
Результат выполнения кода:
"Redirects to: /thanks/"
Динамическое определение success_url
Для более гибкой логики можно переопределить метод
get_success_url, который возвращает URL для
перенаправления:
from 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)
Результат выполнения кода:
"Redirects to: /dashboard/ (для авторизованных) или /feedback-success/ (для анонимов)"
Смотрите также
-
атрибут
form_class,
который определяет класс формы для отображения -
метод
form_valid,
который вызывается при успешной валидации формы -
метод
get_success_url,
который используется для динамического определения URL -
функция
reverse_lazy,
которая используется для отложенного построения URL