2011-12-18 7 views
7

私はこのような設定のモデルを持っていますChildModelのチェンジリストを開くリンクがありますが、選択した親からの子のみを表示するフィルタが適用されています。Djangoの管理チェンジ・フィルタリング/リンク

class ParentAdmin(admin.ModelAdmin) 
    list_display = ('id', 'some_col', 'some_other', 'list_children') 
    def list_children(self, obj): 
     url = urlresolvers.reverse('admin:appname_childmodel_changelist') 
     return '<a href="{0}?parent__id__exact={1}">List children</a>'.format(url, obj.id) 
    list_children.allow_tags = True 
    list_children.short_description = 'Children'   

admin.site.register(Parent, ParentAdmin) 

は、だから私の質問は、それがこのなしで同じことを達成することが可能ですされています。今のところ、私はこの方法でそれを実現し、私はそれを行うにはクリーンな方法があると思い、私は方法がわかりません"リンクハッキング"? チェンジリスト内の別の列に、その子供のいずれかがおもちゃを持っていることを示すことは可能ですか?

答えて

2

list_children列を表示するあなたのアプローチは正しいと思います。 「リンクハッキング」について心配する必要はありません。

オブジェクトの子供のいずれかがおもちゃを持っているかどうかを示す列を表示するには、ParentAdminクラスで別のメソッドを定義し、それ以前のようにlist_displayに追加します。

class ParentAdmin(admin.ModelAdmin): 
    list_display = ('id', 'some_col', 'some_other', 'list_children', 'children_has_toys') 
    ... 
    def children_has_toys(self, obj): 
     """ 
     Returns 'yes' if any of the object's children has toys, otherwise 'no' 
     """ 
     return ToyModel.objects.filter(child_owner__parent=obj).exists() 
    children_has_toys.boolean = True 

boolean=Trueを設定すると、それはboolean型フィールドの場合と同様にDjangoが「オン」または「オフ」のアイコンをレンダリングすることを意味します。このアプローチでは、親(つまりO(n))ごとに1つのクエリが必要です。プロダクションで受け入れ可能なパフォーマンスが得られるかどうかをテストする必要があります。

+0

本当にありがとうございました。私はdjangoがチェンジリストリンク機能のためのよりエレガントな方法を持っていないことに驚いています。とにかくおかげで、あなたの助けは今すべての私の問題を解決しました。 –