2017-02-06 61 views
0

我希望我的用户能够看到页面,更新该页面,然后返回到该页面或继续进行更多编辑。Django - UpdateView中的动态success_url

这里的视图来显示信息:所以现在他们想加入一个游戏信息

# 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。我试过的所有东西都会导致错误。

(我(一饮而尽)的想法是,我要重新写使用的PK让这东西是比较容易的网址,但我想确认)

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

 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:

学会了如何使用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 
+0

你并不需要使用的PK,但你真的应该使用URL参数而不是查询字符串。 –

+0

请用'get_success_url'显示你已经尝试了什么。在URL('/ gameview/1 /)'中拥有主键比查询字符串('/ gameview /?match = 1')更干净,但如果不想要,则不必切换。您可以在'get_success_url'中访问'self.request.GET.get('match')'。 – Alasdair

+0

@DanielRoseman我可以问为什么?更安全? –

回答

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() 
+0

那......可以......工作吗?谢谢,我有机会时会更新! –