success_url в UpdateView, на основе пройденного значения
Как я могу установить success_url
на основе параметра?
Я действительно хочу вернуться туда, откуда я пришел, а не какое-то статическое место. В псевдокоде:
url(r'^entry/(?P<pk>\d+)/edit/(?P<category>\d+)',
UpdateView.as_view(model=Entry,
template_name='generic_form_popup.html',
success_url='/category/%(category)')),
Это означало бы: отредактировать запись pk
а затем вернуться в категорию. Здесь запись может быть частью нескольких категорий.
Ответы
Ответ 1
Создайте класс MyUpdateView
унаследованный от UpdateView
и переопределите метод get_success_url
:
class MyUpdateView(UpdateView):
def get_success_url(self):
pass #return the appropriate success url
Также мне нравится передавать такие параметры, как template_name и модель внутри наследуемого класса, но не в .as_view()
в urls.py
Ответ 2
Имел ту же проблему. Был в состоянии получить paramater от self.kwargs, как сказал Дима:
def get_success_url(self):
if 'slug' in self.kwargs:
slug = self.kwargs['slug']
else:
slug = 'demo'
return reverse('app_upload', kwargs={'pk': self._id, 'slug': slug})
Ответ 3
Почему бы вам не добавить "следующий" параметр в свою форму (шаблон) и не поймать его в своем представлении. Это обычная практика для того, чтобы добиться такой переадресации.
Ответ 4
Определите get_absolute_url(self)
на вашей модели. пример
class Poll(models.Model):
question = models.CharField(max_length=100)
slug = models.SlugField(max_length=50)
# etc ...
def get_absolute_url(self):
return reverse('poll', args=[self.slug])
Если ваш PollUpdateView(UpdateView)
загружает экземпляр этой модели в качестве object
, по умолчанию будет искать метод get_absolute_url()
чтобы выяснить, куда перенаправить после POST
. затем
url(r'^polls/(?P<slug>\w+)/, UpdateView.as_view(
model=Poll, template_name='generic_form_popup.html'),
следует сделать.