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.
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
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})
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.
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.