Django - UpdateView中的动态success_url

时间:2017-02-06 10:48:42

标签: django

我希望我的用户能够查看页面,更新该页面,然后返回该页面或继续进行更多编辑。

以下是显示信息的视图:

    # 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    

所以现在他们想要添加有关游戏的信息。我使用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

当用户在后一个​​视图中完成更新时,应该在完全相同的团队中将它们返回给前者。 This post帮助我朝着正确的方向前进,使用'get_success_url',但我仍然被卡住,因为我不认为我正在使用kwargs。我尝试过的所有内容都会导致错误。

(我的(gulp)认为我应该重新编写使用PK的网址,以便这些东西更容易,但我想确保)

编辑: 我的成功尝试(注意:我有两个提交按钮,一个用于更新,一个用于更新和添加注释)。

     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})

解决方案:

了解如何使用URL参数和kwargs: (对于像我这样的新人,self.kwargs.get很棒)

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

1 个答案:

答案 0 :(得分:0)

模型对象的get_absolute_url怎么样?

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)])

在你的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()