2012-06-14 3 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 

はまた、私は(において継承クラスビューの内部テンプレート名とモデルのような、そのようなパラメータを渡すのが好きではなく、.as_viewに)URLで。 py

+0

パラメータ(idやcategoryなど)はどこに入りますか? – Bryce

+0

彼らはself.kwargsに入っています –

0

あなたのフォーム(テンプレート)に「次の」パラメータを追加して、あなたのビューでそれをキャッチしてみませんか?このようにリダイレクトするのが一般的な方法です。

+0

どのように私はそれをキャッチしますか?コードを提供できますか? – Bryce

20

同じ問題がありました。

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

これは私には便利でしたが、スラッグが "/"で始まっていることを確認する必要がありましたが、そうでなければ "/ formpage/successurl/successurl/successurl /"のようなURL終わりではなく、始まりです。 – JayCrossler

+0

@JayCrossler - 私はそれが相対アドレスと絶対アドレスのためだと思います。先頭のスラッシュは、そこからURLが始まることを意味します。スラッシュがなければ、lsコマンドでunixパスのように、前のurlに追加されます。 –

+2

.get()を使ってさらに簡単にすることができます:slug = self.kwargs.get( 'slug'、 'demo') –

0

があなたのモデルにget_absolute_url(self)を定義します。ディマが述べたようにself.kwargsからのparamaterを取得することができました。例

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)負荷、それはget_absolute_url()メソッドのデフォルトの外観で把握することになるobjectとして、そのモデルのインスタンスは、POST後にリダイレクトする場合。その後、

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

を行う必要があります。

関連する問題