2009-09-12 9 views
15

モデルの管理変更リストを表示すると、外部キーに対応する列をそれぞれのページにリンクできますか?私は、Barを外部キーとして含むFooオブジェクトを持っています。 Fooの管理変更リストを表示していて、display_list列にBarを含めるように設定している場合、メイン列はFooインスタンスの編集ページにリンクし、Bar列はBooインスタンスの編集ページにリンクします。私は使用されているテンプレートを上書きすることができると理解していますが、それを必要としないソリューションがあれば私は興味がありました。リストの外部キー変更ページへの変更

答えて

21

リンクのHTMLを返すチェンジリストで使用するカスタムメソッドを定義することができます。述べたように、あなたの質問と

from django.core.urlresolvers import reverse 

class MyFooAdmin(admin.ModelAdmin): 
    list_display = ('foo', 'bar_link') 

    def bar_link(self, obj): 
     url = reverse('admin:myapp_bar_change', args=(obj.pk,)) 
     return '<a href="%s">Edit Bar</a>' % url 
    bar_link.allow_tags = True 

一つの問題 - Fooのは、あなたがそのバーの編集ページにリンクすることができますので、1つのバーに、各FOOリンクを棒に外部キーを持っている場合。しかし、各バーは複数のfoosにリンクしているので、 'Fooインスタンスの編集ページ'へのリンクを尋ねるのは意味がありません。あなたが行うことができますのみに設定されたフィルタとFooのためのチェンジページへのリンクは、このバーにリンクインスタンスを示している。

def foo_link(self, obj): 
     url = reverse('admin:myapp_foo_changelist') 
     return '<a href="%s?bar=%s">See Foos</a>' % (url, obj.pk) 
    foo_link.allow_tags = True 
+0

私はそれを試してみましょう。私がFooの変更ページにリンクすることは、Fooの変更リストからFooの変更ページへの既定のリンクを維持することです(私はそれではっきりしていないことを認めます)。 – Adam

+2

これは1.4または1.5でのアップデートです(これはDjango自体の素晴らしい追加のようですので、すでに 'contrib.admin'に追加されているかもしれません)? –

1

チェンジ変異体は、すべての変更あなたを離れてクリアしますが、私は、発見し、ダニエルの答えを言っていますすでに終わった。だから、これはそれを修正する方法である:

まず、あなたは、私が行ったようにchangelist_viewまたはquerysetをラップすることによってそれを行うことができ、要求への参照を取得する必要があります。

class CountryAdmin(ModelAdmin): 
    model = Country 
    list_display = ('pk', 'continent_changelist') 

    # ... 

    def queryset(self, request): 
     self._get_params = request.GET 
     return super(CountryAdmin, self).queryset(request) 

    def continent_changelist(self, obj): 
     url = reverse('admin:yourapp_country_changelist') 
     querystring = self._get_params.copy() 
     querystring['continent__id__exact'] = obj.continent.pk 
     return u'<a href="{0}?{1}">{2}</a>'.format(
      url, querystring.urlencode(), obj.continent) 
    continent_changelist.allow_tags = True 

あなたにフィルタを与えることチェンジリストの行内私は別の質問でこれに答えましたが、これは実際に最初に来た場所なので、ここにそれを記録したいと思いました。 :-)

関連する問題