2009-09-12 17 views
15

Model için yönetici değiştirme listesini görüntülerken, ilgili sayfalara yabancı anahtarların bağlantılarına karşılık gelen sütunları yapmak mümkün müdür? Basit bir örnek, yabancı bir anahtar olarak Bar içeren bir Foo nesnesine sahip. Foo için yönetici değişim listesini görüntülüyorsam (ve display_list sütunlarına Çubuğu dahil etmeyi ayarladıysa), ana sütunu Foo örneğinin düzenleme sayfasına bağlanırken, Bar sütunu Boo örneğinin düzenleme sayfasına bağlanır. Anladığım kadarıyla, kullanılan şablonu geçersiz kılabiliyorum, ancak bunu gerektirmeyen bir çözüm olup olmadığını merak ettim.Yabancı anahtar değişiklik listesine geç Listeyi göster

cevap

21

Bağlantının HTML'sini döndüren değişiklik uzmanında kullanmak için özel bir yöntem tanımlayabilirsiniz. Foo o barda için düzenleme sayfaya bağlantı böylece, tek bir bara sonra her foo bağlantıları Bar için yabancı anahtar varsa - belirtildiği gibi bir soru ile

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 

Bir problem. Bununla birlikte, her çubuk birden fazla konuşmaya bağlanır, bu nedenle 'Foo örneğinin düzenleme sayfasına' bir bağlantı sormanız mantıklı değildir. ayarlı filtre ile Foo için değişiklik listesi sayfasına bağlantı sadece bu Bar'da bağlantı veren örneklerini göstermek Ne yapabilirsiniz geçerli: Değişiklik listesi varyantı herhangi bir değişiklik uzakta temizler rağmen

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

Bunu deneyeceğim. Foo değişim sayfasına bağlanarak kastettiğim şey sadece Foo değişim listesindeki Foo değişim sayfasının varsayılan bağlantısını korumaktır (bununla çok net olmadığını itiraf ediyorum). – Adam

+2

Bu 1.4 veya 1.5 sürümünde herhangi bir güncelleme (Django'nun kendisinin büyük bir eki gibi göründüğü anlamına geliyor, bu yüzden 'contrib.admin''e zaten eklenmiş olabilir)? –

1

buldum ve Daniel'in cevabı sevdim, sen zaten yapıldı. Yani bu düzeltmek için bir yoldur:

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 

size bir filtre versin:

Önce istek bir başvuru almak gerekir, sen benim yaptığım gibi changelist_view veya queryset sararak bunu yapabilir değişmeyen satırların içinde. Bunu başka bir soruda cevapladım, ama ilk önce geldiğim yer burasıydı, bu yüzden burada kaydetmek istedim. :-)