2013-07-29 8 views
5

In un'applicazione Django lavorare con ricette che ho sottoclasse DeleteView di creare il mio IngredientListItemDeleteView, ma vorrei che il risultato di get_success_url dipendere da una proprietà del prodotto che è stato appena eliminato .Uso get_success_url su un DeleteView quando i dati in questione è stato rimosso

mi piacerebbe fare qualcosa di simile:

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

ho capito che ho un errore 404 perché l'articolo in questione non esiste più, ma non ho avuto fortuna memorizzare le informazioni relative alla voce (vale a dire, la sua ricetta contenente) prima che venga eliminato. Per esempio, se ho messo nel metodo get qualsiasi codice come

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

poi con il tempo success_url si vede (dopo la cancellazione), ha il valore None.

Come posso rendere il mio URL di successo dipende da questa proprietà dell'elemento eliminato?

risposta

6

In Django 1.6, il metodo delete è stato modificato in modo che il metodo get_success_url viene chiamato prima si elimina l'oggetto.

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) 

Si consiglia di eseguire l'override del metodo di eliminazione come sopra, fino all'aggiornamento a Django 1.6. Se hai bisogno di farlo per più classi, potresti creare un mixin.

Nota che non è necessario recuperare l'articolo dal database con get_item_or_404 - è possibile accedervi nel metodo get_success_url come self.object.

+0

Grazie - ma per chiarire, ho bisogno di definire self.object = self.get_object() prima che io possa effettivamente usare self.object. Grazie per il suggerimento - sembra meglio dell'utilizzo di get_item_or_404 – bryn

Problemi correlati