Pregunta Usando get_success_url en un DeleteView cuando los datos relevantes han sido eliminados


En una aplicación Django que trabaja con recetas, he subclasificado DeleteView para crear mi IngredientListItemDeleteView, pero me gustaría el resultado de get_success_url para depender de una propiedad del elemento que se acaba de eliminar.

Me gustaría hacer algo como esto:

def get_success_url(self):
    item = get_object_or_404(IngredientListItem, pk=self.kwargs['pk'])   # -> 404
    return this_item.recipe.get_absolute_url()

Entiendo que recibo un error 404 porque el artículo en cuestión ya no existe, pero no he tenido la suerte de almacenar la información relevante sobre el artículo (es decir, su receta que contiene) antes de que se elimine. Por ejemplo, si pongo en el get método cualquier código como

self.success_url = get_object_or_404(IngredientListItem, 
                                pk=self.kwargs['pk']).recipe.get_absolute_url()

entonces por el tiempo success_url se mira (después de la eliminación), tiene el valor Ninguno.

¿Cómo puedo hacer que mi URL de éxito dependa de esta propiedad del elemento eliminado?


5
2017-07-29 10:28


origen


Respuestas:


En Django 1.6, el delete método ha sido cambiado para que el get_success_url método se llama antes de el objeto es eliminado

def delete(self, request, *args, **kwargs):
    """
    Calls the delete() method on the fetched object and then
    redirects to the success URL.
    """
    self.object = self.get_object()
    success_url = self.get_success_url()
    self.object.delete()
    return HttpResponseRedirect(success_url)

Le recomiendo que anule su método de eliminación como se indica arriba, hasta que actualice a Django 1.6. Si necesita hacer esto para múltiples clases, puede crear un mixin.

Tenga en cuenta que no necesita obtener el elemento de la base de datos con get_item_or_404 - puedes acceder a él en tu get_success_url método como self.object.


7
2017-07-29 10:45



Preguntas populares