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'),

следует сделать.