web-dev-qa-db-fra.com

success_url dans UpdateView, en fonction de la valeur transmise

Comment définir success_url en fonction d'un paramètre?
Je veux vraiment retourner chez moi, pas dans un endroit statique. En pseudo code:

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

Ce qui voudrait dire: éditer l'entrée pk et ensuite retourner à 'catégorie'. Ici, une entrée peut faire partie de plusieurs catégories.

25
Bryce

Créez une classe MyUpdateView héritée de UpdateView et substituez la méthode get_success_url:

class MyUpdateView(UpdateView):
    def get_success_url(self):
        pass #return the appropriate success url

Aussi, j'aime bien passer des paramètres tels que template_name et model à l'intérieur de la vue de classe héritée, mais pas dans .as_view() dans urls.py

46
Dima Bildin

Avait le même problème. A pu obtenir le paramètre de self.kwargs comme Dima l'a mentionné:

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})
21
Aleck Landgraf

Définissez get_absolute_url(self) sur votre modèle. Exemple

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])

Si votre PollUpdateView(UpdateView) charge une instance de ce modèle sous la forme object, il recherchera par défaut une méthode get_absolute_url() pour déterminer où rediriger après la POST. ensuite

url(r'^polls/(?P<slug>\w+)/, UpdateView.as_view(
    model=Poll, template_name='generic_form_popup.html'),

devrait faire.

1
C14L

Pourquoi n'ajoutez-vous pas un paramètre 'next' à votre formulaire (modèle) et ne le capturez pas dans votre vue. Il est courant de rediriger de cette manière.

0