2017-06-16 5 views
0

J'essaie d'utiliser rediriger vue dans django, mais je continue à obtenir cette erreur:Django redirectView retourne Aucun

The view gp_accountant.gp_taxes.views.TaxRateDeleteView didn't return an HttpResponse object. It returned None instead.

J'ai fondé mon code sur this question.

Quelqu'un sait où se situe le problème?

Ceci est mon fichier URL (chemin: get-paid/gp_accountant/gp_taxes/urls.py):

app_name = 'gp_taxes' 
urlpatterns = [ 
    url(r'^$', TaxesListView.as_view(), name='list'), 
    url(
     r'^delete_rate/(?P<pk>\d+)/$', 
     TaxRateDeleteView.as_view(pattern_name='accountant:gp_taxes:update'), 
     name='delete_rate' 
    ), 
] 

Le TaxRateDeleteView:

class TaxRateDeleteView(RedirectView): 
    def dispatch(self, request, *args, **kwargs): 
     TaxRate.objects.get(id=int(kwargs['pk'])).delete() 
+3

** En utilisant une vue de redirection pour la suppression d'objets est une mauvaise idée **. Vous ne devriez pas supprimer des objets avec des requêtes get comme ça. The ['DeleteView'] (https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-editing/#deleteview) serait un meilleur endroit pour commencer. – Alasdair

+0

Merci de votre attention. J'ai répondu upvoted mentionnant ceci. – gonczor

Répondre

3

@FazilZaid presque correct, vous devez retourner la dernière ligne de sa réponse. Le problème est que votre dispatch ne retourne rien en général, il devrait revenir HttpResponseRedirect afin de le faire fonctionner avec super appel que vous devez fournir success_url à votre vue

class TaxRateDeleteView(RedirectView): 
    success_url = # <- your url here 

    def dispatch(self, request, *args, **kwargs): 
     TaxRate.objects.get(id=int(kwargs['pk'])).delete() 
     return super(TaxRateDeleteView,self).dispatch(request, *args, **kwargs) 

également selon ce commentaire par @Alasdair

Using a redirect view for deleting objects is a bad idea. You should not be deleting objects with get requests like this.

Vous devez utiliser https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-editing/#django.views.generic.edit.DeleteView qui est juste moyen de supprimer l'objet, au lieu de RedirectView

+0

mon mauvais, n'a pas remarqué .... merci de rappeler cependant – zaidfazil

+0

A travaillé comme un charme. +1 pour mentionner une meilleure façon d'effectuer une suppression. – gonczor

0

Modifier votre point de vue,

class TaxRateDeleteView(RedirectView): 
    def dispatch(self, request, *args, **kwargs): 
     TaxRate.objects.get(id=int(kwargs['pk'])).delete() 
     return super(TaxRateDeleteView,self).dispatch(request, *args, **kwargs) 

super appel en mode d'expédition de votre vue.

0

Vous ne devriez pas être surchargez l'envoi métho ré.

Essayez quelque chose comme ceci:

class TaxRateDeleteView(RedirectView): 
    def get_redirect_url(self, *args, **kwargs): 
     TaxRate.objects.get(id=int(kwargs['pk'])).delete() 
     return reverse('delete_rate') 
+1

Je ne pense pas que mettre la logique dans 'get_redirect_url' est la bonne approche. Dans l'ensemble, je m'attends à ce que seulement pour me donner url ne supprime rien. – gonczor

+0

Pourquoi est-ce que c'est mieux dans la méthode d'expédition? De cette façon, cela ne se produit que si tout le reste est correct pour la vue de redirection. –

+0

Ok, pour être juste il y a une méthode de suppression sur le RedirectView, ce qui serait le meilleur endroit pour le mettre, bien que vous ayez besoin de vous assurer qu'il s'agit d'une demande de suppression envoyée à la vue. Je ne pense pas que la répartition soit le meilleur endroit pour supprimer des objets non plus. –