Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - dynamic success_url in UpdateView

Tags:

django

I want my user to be able to see a page, update that page, and then be returned to that page or continue making more edits.

Here's the view to show the information:

    # urls.py      
url(r'^gameview/$', views.GameView.as_view(template_name='matchview.html'), name='GameView')

# Views.py
class GameView(generic.TemplateView):
    template_name = "matchview.html"

    def get_context_data(self, **kwargs):
        context = super(GameView, self).get_context_data(**kwargs)
        q = self.request.GET.get('match')
        context['report'] = GameNotes.objects.filter(game=q)
        context['game'] = Schedule.objects.get(match=q)
        context['gamepic'] = Photo.objects.filter(game=q)
        return context    

So now they want to add information about a game. I use an UpdateView

class GameView(generic.TemplateView):
    template_name = "matchview.html"

def get_context_data(self, **kwargs):
    context = super(GameView, self).get_context_data(**kwargs)
    q = self.request.GET.get('match')
    context['report'] = GameNotes.objects.filter(game=q)
    context['game'] = Schedule.objects.get(match=q)
    context['gamepic'] = Photo.objects.filter(game=q)
    return context

When the user finishes updating in the latter view, they should be returned to the former on the exact same team. This post helped me move in the right direction insofar as using 'get_success_url', but I'm still stuck because I don't think I'm using kwargs. Everything I've tried has resulted in errors.

(My (gulp) thought is that I should re-write the urls to use PKs so that this stuff is easier, but I wanted to make sure)

EDIT: My fugly attempt (Note: I Have two submit buttons, one to update and one to update and add notes).

     def form_valid(self, form):
    if form.is_valid():
        form.save()
    if 'submit' in self.request.POST:
        q = self.request.GET.get('match')
        return reverse_lazy('TeamView', args=(q))
    else:
        return render('addnotes', {'game' : q})

SOLUTION:

Learned how to use URL Parameters and kwargs: (for anyone new like me, self.kwargs.get is brilliant)

def get_success_url(self, **kwargs):
        q = self.kwargs.get('match')
        if "submit" in self.request.POST:
        url = reverse('GameView', args={q : 'match'})
        else:
            url = reverse('AddNotes', args={q : 'match'})
        return url
like image 424
Andrew Saltz Avatar asked Oct 16 '25 16:10

Andrew Saltz


1 Answers

What about get_absolute_url for the model object?

https://docs.djangoproject.com/en/1.10/ref/models/instances/#get-absolute-url

from django.urls import reverse

class GameModel(models.Model):
    ....

    def get_absolute_url(self):
      return reverse('game:single_page', args=[str(self.id)])

And in your GameView:

class GameView(generic.TemplateView):
    template_name = "matchview.html"

    def get_context_data(self, **kwargs):
        ....

    def get_success_url(self, **kwargs):
        return self.object.get_absolute_url()
like image 158
Alex T Avatar answered Oct 19 '25 10:10

Alex T