2016-09-18 5 views
4

Ich mache eine Django-App, die TV-Show-Episoden verfolgt. Dies ist für eine Seite in einer bestimmten Show-Instanz. Wenn ein Nutzer klickt, um eine Saison hinzuzufügen/zu subtrahieren, möchte ich, dass die Seite sie in die gleiche Detailansicht umleitet. Im Moment habe ich ihn im Index, der die Liste aller Show-Instanzen anzeigt.Django: Umleiten auf die gleiche Seite nach POST-Methode mit Klassen-basierte Ansichten

show-detail.html

<form action="{% url 'show:addseason' show=show %}" method="post"> 
    {% csrf_token %} 

    <button class="btn btn-default" type="submit">+</button> 
</form> 

<form action="{% url 'show:subtractseason' show=show %}" method="post"> 
    {% csrf_token %} 

    <button class="btn btn-default" type="submit">-</button> 
</form> 

views.py

class ShowDetail(DetailView): 
    model = Show 
    slug_field = "title" 
    slug_url_kwarg = "show" 
    template_name = 'show/show-detail.html' 

class AddSeason(UpdateView): 
    model = Show 
    slug_field = 'title' 
    slug_url_kwarg = 'show' 
    fields = [] 

    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.season += 1 
     instance.save() 

     return redirect('show:index') 

class SubtractSeason(UpdateView): 
    model = Show 
    slug_field = 'title' 
    slug_url_kwarg = 'show' 
    fields = [] 

    def form_valid(self, form): 
     instance = form.save(commit=False) 
     if (instance.season >= 0): 
      instance.season -= 1 
     else: 
      instance.season = 0 

     instance.save() 

     return redirect('show:index') 

urls.py

url(r'^$', views.IndexView.as_view(), name='index'), 

url(r'^about/$', views.AboutView.as_view(), name='about'), 

# form to add show 
url(r'^add/$', views.ShowCreate.as_view(), name='show-add'), 

# edit show 
#url(r'^(?P<show>[\w ]+)/edit/$', views.ShowUpdate.as_view(), name='show-update'), 

# delete show 
url(r'^(?P<show>[\w ]+)/delete/$', views.ShowDelete.as_view(), name='show-delete'), 

# signup 
url(r'^register/$', views.UserFormView.as_view(), name='register'), 

# login 
url(r'^login/$', views.LoginView.as_view(), name='login'), 

# logout 
url(r'^logout/$', views.LogoutView.as_view(), name='logout'), 

url(r'^error/$', views.ErrorView.as_view(), name='error'), 

url(r'^(?P<show>[\w ]+)/$', views.ShowDetail.as_view(), name='show-detail'), 

url(r'^(?P<show>[\w ]+)/addseason/$', views.AddSeason.as_view(), name='addseason'), 

url(r'^(?P<show>[\w ]+)/subtractseason/$', views.SubtractSeason.as_view(), name='subtractseason'), 

url(r'^(?P<show>[\w ]+)/addepisode/$', views.AddEpisode.as_view(), name='addepisode'), 

url(r'^(?P<show>[\w ]+)/subtractepisode/$', views.SubtractEpisode.as_view(), name='subtractepisode'), 

Ich erhalte eine Fehlermeldung, wenn ich versuchen

return redirect('show:detail') 

Dies ist der Fehler

NoReverseMatch at /Daredevil/addseason/ 
Reverse for 'detail' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 

Antwort

1

Ich vermute, Sie kwarg zur Verfügung stellen müssen, die Show zu identifizieren, wenn Sie umleiten, obwohl ich nicht den Code sehen können für Ihre DetailView Ich würde davon ausgehen, Der Kwarg heißt entweder pk oder möglicherweise show, ausgehend von der Konvention, die Sie in AddSeason und SubtractSeason verwendet haben. Versuchen:

redirect('show:detail', kwargs={'show': instance.pk}) 

EDIT: der Name der Detail-URL ist 'show-detail', so dass die scoped Viewname wäre 'show:show-detail' (wenn es in der show Namensraum wie die anderen Urls ist). Ich denke immer noch, es wäre allerdings eine kwarg benötigen, versuchen:

redirect('show:show-detail', kwargs={'show': instance.pk}) 
+0

Hey, Ich habe versucht, dass es nicht funktioniert hat. Ich habe meine Show-Detailansicht eingefügt. Bitte hilf mir, wenn du kannst. – user298519

+0

Was ist der Fehler, den Sie bekommen, ist es das gleiche? Kannst du deine URLs posten? –

+0

Gleicher Fehler, und bearbeitet meinen Beitrag, um meine URLs zu zeigen! – user298519

4

zur gleichen Seite (zB ein HTTP-GET) nach einem POST umgeleitet, Ich mag ...

return HttpResponseRedirect("") # from django.http import HttpResponseRedirect 

es vermeidet auch hartzucodieren die show:detail Routennamen und eine lil‘klare Absicht wiese (für mich zumindest!)

1

für CBV:

from django.http import HttpResponseRedirect 


return HttpResponseRedirect(self.request.path_info) 

Für Funktionssicht:

from django.http import HttpResponseRedirect 


return HttpResponseRedirect(request.path_info) 
Verwandte Themen