2012-06-14 37 views
24

如何根据参数设置success_url
我真的想回到我来自的地方,而不是一些静态的地方。在伪代码:UpdateView中的success_url,基于传递的值

url(r'^entry/(?P<pk>\d+)/edit/(?P<category>\d+)', 
    UpdateView.as_view(model=Entry, 
         template_name='generic_form_popup.html', 
         success_url='/category/%(category)')), 

这将意味着:编辑录入pk,然后返回到“类”。这里一个条目可以是多个类别的一部分。

回答

42

创建从继承了的UpdateView类MyUpdateView并重写get_success_url方法:

class MyUpdateView(UpdateView): 
    def get_success_url(self): 
     pass #return the appropriate success url 

此外,我想通过继承了类视图的内部这样的参数等TEMPLATE_NAME和模型,但不是在.as_view()中的URL。 py

+0

参数(例如id和类别)在哪里进来? – Bryce

+0

他们在self.kwargs –

0

为什么不给表单添加'next'参数(模板)并在视图中捕捉它。通过这种方式实现重定向是很常见的做法。

+0

我是如何“捕捉”的?你能提供代码吗? – Bryce

20

有同样的问题。能够从self.kwargs得到paramater为迪马提到:

def get_success_url(self): 
     if 'slug' in self.kwargs: 
      slug = self.kwargs['slug'] 
     else: 
      slug = 'demo' 
     return reverse('app_upload', kwargs={'pk': self._id, 'slug': slug}) 
+0

这对我很有用 - 虽然我需要确保slug以“/”开头,否则我得到像“/ formpage/successurl/successurl/successurl /”的url,结束,而不是开始。 – JayCrossler

+0

@JayCrossler - 我认为这是由于相对地址与绝对地址。主要的斜杠意味着URL从那里开始。如果没有斜杠,它会被追加到前一个URL中,就像使用ls命令的unix路径一样。 –

+2

可以进一步简化使用.get():slug = self.kwargs.get('slug','demo') –

0

你的模型定义get_absolute_url(self)。例如

class Poll(models.Model): 
    question = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=50) 
    # etc ... 

    def get_absolute_url(self): 
     return reverse('poll', args=[self.slug]) 

如果您PollUpdateView(UpdateView)加载该模型的实例为object,默认情况下将寻找一个get_absolute_url()方法来找出重定向到POST后。然后

url(r'^polls/(?P<slug>\w+)/, UpdateView.as_view(
    model=Poll, template_name='generic_form_popup.html'), 

应该做的。