2009-09-12 3 views
15

모델에 대한 관리자 변경 목록을 볼 때 외래 키에 해당하는 열을 각각의 페이지에 연결할 수 있습니까? 간단한 예제는 Bar가 외래 키로 포함 된 Foo 객체입니다. Foo에 대한 관리자 변경 목록을보고 display_list 열에 Bar를 포함하도록 설정 한 경우 기본 열은 Foo 인스턴스의 편집 페이지에 연결되는 반면 Bar 열은 Boo 인스턴스의 편집 페이지에 연결됩니다. 사용 된 템플릿을 재정의 할 수 있음을 알고 있지만 필요하지 않은 솔루션이 있는지 궁금합니다.외부 키 변경 목록 링크 변경

답변

21

링크의 HTML을 리턴하는 변경 목록에 사용할 사용자 정의 메소드를 정의 할 수 있습니다. 푸 당신이 그 막대의 편집 페이지에 링크 할 수 있도록, 하나의 줄에 각 foo는 링크를 막대에 외래 키가있는 경우 - 명시된 바와 같이 귀하의 질문에

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 

하나의 문제. 그러나 각 막대는 여러 개의 foos에 연결되므로 '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의 모든 업데이트 (이 말은 장고 자체에 대한 훌륭한 추가 기능인 것 같아서 이미'contrib.admin'에 추가 된 것 같습니다)? –

1

내가 발견하고 다니엘의 답변을 좋아, 당신 벌써 했어. 그래서 그 해결하는 방법입니다 :

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 

당신에게 필터를 줄 것이다 :

먼저 당신이 요청에 대한 참조를 얻을 필요가, 당신은 내가 그랬던 것처럼 changelist_view 또는 queryset 포장으로 그렇게 할 수 있습니다 변경 목록 행 내부. 나는 다른 질문으로 이것을 대답했다. 그러나 이것이 내가 실제로 왔던 장소였다. 그래서 그것을 여기에 기록하고 싶었다. :-)