2012-06-14 11 views
24

¿Cómo puedo establecer success_url según un parámetro?
Realmente quiero volver al lugar de donde vengo, no a un lugar estático. En pseudocódigo:success_url en UpdateView, según el valor pasado

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

Lo que significaría: modificar un ingreso pk y luego regresar a 'categoría'. Aquí una entrada puede ser parte de múltiples categorías.

Respuesta

42

Crear una MyUpdateView clase inheritted de UpdateView y reemplazar el método get_success_url:

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

También me gusta pasar tales parámetros como template_name y el modelo dentro de vista de clase inheritted, pero no en .as_view() en las direcciones URL. py

+0

¿Dónde entran los parámetros (por ejemplo, identificación y categoría)? – Bryce

+0

Están en self.kwargs –

0

¿Por qué no agrega un 'siguiente' parámetro a su formulario (plantilla) y lo captura en su vista. Es una práctica común para lograr redirigir de esta manera.

+0

¿Cómo 'atrapo' eso? ¿Puedes proporcionar código? – Bryce

20

Tenía el mismo problema. Fue capaz de obtener el parámetro de self.kwargs de Dima como se menciona:

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

Esto fue útil para mí, aunque necesitaba asegurarme de que la babosa comenzara con "/", de lo contrario estaba obteniendo URL como "/ formpage/successurl/successurl/successurl /" que seguían agregando a el final, en lugar del comienzo. – JayCrossler

+0

@JayCrossler: creo que se debe a las direcciones relativas frente a las direcciones absolutas. La barra diagonal implica que la URL comienza allí. Sin una barra oblicua, se anexa a la url anterior, como las rutas Unix con el comando ls. –

+2

Podría simplificar aún más el uso de .get(): slug = self.kwargs.get ('slug', 'demo') –

0

Definir get_absolute_url(self) en su modelo. Ejemplo

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 sus cargas PollUpdateView(UpdateView) una instancia de ese modelo como object, será por la apariencia predeterminada de un método get_absolute_url() de averiguar dónde redirigir a después de la POST. Entonces

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

debería hacer.

Cuestiones relacionadas