Краткий ответ : вам необходимо указать атрибут success_url
[Django-doc] или переопределить form_valid
[Джанго-док] .
В CreateView
[Джанго-док] (большинство просмотров с FormMixin
[Джанго-док] ), вам нужно указать, что должно произойти, когда форма была успешно обработана.
По умолчанию a ModelFormMixin
[Django-doc] будет первым сохранить объект [GitHub] :
def form_valid(self, form):
"""If the form is valid, save the associated model."""
self.object = form.save()
return <b>super().form_valid(form)</b>
, а затем базовый FormMixin
будет перенаправлять на success_url
[GitHub] :
def form_valid(self, form):
"""If the form is valid, redirect to the supplied URL."""
return HttpResponseRedirect(<b>self.get_success_url()</b>)
get_success_url
извлечет атрибут success_url
[GitHub] и вызовет ошибку ImproperlyConfigured
, если она отсутствует:
def get_success_url(self):
"""Return the URL to redirect to after processing a valid form."""
if not self.success_url:
raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
return <b>str(self.success_url)</b> # success_url may be lazy
Таким образом, вы можете указать success_url
, например, с помощью reverse_lazy
[Django-doc] :
from django.urls import <b>reverse_lazy</b>
class PersonCreateView(CreateView):
model = Person
fields = ['name','surname']
<b>success_url = reverse_lazy('persons')</b>
Здесь persons
- это имя из path(..)
, на которое мы перенаправляем. Перенаправление, как правило, является предпочтительным способом обработки успешной формы: он является частью Post / Redirect / Get архитектурного шаблона [wiki] . Если вы отобразите страницу для запроса POST, то пользователь, который обновит страницу в браузере, повторно отправит те же данные на сервер и, таким образом, может создать секунду . объект.
Другой вариант - переопределить form_valid
и сделать что-то еще после вызова super().form_valid(form)
(так как это сохранит объект в базе данных).