2012-06-14 25 views
24

Wie kann ich success_url basierend auf einem Parameter festlegen?
Ich möchte wirklich dorthin zurückkehren, wo ich herkomme, nicht an einem statischen Ort. In Pseudo-Code:success_url in UpdateView, basierend auf übergebenen Wert

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

was bedeuten würde: bearbeiten Eintrag pk und dann wieder auf 'Kategorie'. Hier kann ein Eintrag Teil mehrerer Kategorien sein.

Antwort

42

eine Klasse von MyUpdateView UpdateView inheritted Erstellen und get_success_url Methode überschreiben:

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

Auch i solche Parameter wie template_name und das Modell innerhalb der inheritted Klassenansicht, jedoch nicht in .as_view() in URLs passieren wollen. py

+0

Wo kommen die Parameter (z. B. ID und Kategorie)? – Bryce

+0

Sie sind in self.kwargs –

0

Warum fügen Sie Ihrem Formular (Vorlage) keinen 'next' Parameter hinzu und fangen ihn in Ihrer Ansicht ab. Es ist üblich, eine Umleitung auf diese Weise zu erreichen.

+0

Wie fange ich das? Können Sie Code bereitstellen? – Bryce

20

Hatte das gleiche Problem. Konnte die Paramater von self.kwargs erhalten, wie Dima erwähnt:

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}) 
+0

Dies war nützlich für mich - obwohl ich sicherstellen musste, dass der Slug mit "/" gestartet wurde, sonst bekam ich URLs wie "/ formpage/successurl/successurl/successurl /", die hinzugefügt wurden das Ende, statt den Anfang. – JayCrossler

+0

@JayCrossler - Ich denke, das liegt an relativen Adressen im Vergleich zu absoluten Adressen. Der führende Schrägstrich bedeutet, dass die URL dort beginnt. Ohne Schrägstrich wird es an die vorherige URL angehängt, wie Unix-Pfade mit dem Befehl ls. –

+2

Könnte die Verwendung von .get() weiter vereinfachen: slug = self.kwargs.get ('slug', 'demo') –

0

definieren get_absolute_url(self) auf Ihrem Modell. Beispiel

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

Wenn Ihre PollUpdateView(UpdateView) Lasten eine Instanz dieses Modells als object, wird es standardmäßig Look für eine get_absolute_url() Methode, herauszufinden, wo zu nach den POST zu umleiten. Dann

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

sollte tun.

Verwandte Themen