2011-12-18 23 views
7

Ben bu kadarını modelleri var:Django yönetici değişiklik listesi filtreleme/link

class ParentModel(models.Model): 
    some_col = models.IntegerField() 
    some_other = models.CharField() 

class ChildModel(models.Model) 
    parent = models.ForeignKey(ParentModel, related_name='children') 

class ToyModel(models.Model) 
    child_owner = models.ForeignKey(ChildModel, related_name='toys') 

Şimdi ParentModel için değişiklik listesi açmak benim yönetici panelinde ben list_display içinde yeni bir alan/sütunun ChildModel'un değişmezini açmak için bir bağlantı ile ancak seçilen ebeveynin yalnızca çocuklarını göstermek için uygulanan bir filtreyle. Şimdilik ben bu yöntemle bunu fark, ama bunu yapmak için temizleyici bir yolu olduğunu düşünüyorum, ben sadece nasıl bilmiyorum:

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) 

Yani benim sorum, bu olmadan aynı elde etmek mümkündür "bağlantı kesmek"? Ayrıca, çocuklarından herhangi biri oyuncak varsa, ParentModel değişiklik listesinde ayrı bir sütunda belirtmek mümkün mü?

cevap

2

list_children sütununu görüntüleme yaklaşımınızın doğru olduğunu düşünüyorum. 'Bağlantı kesmek' için endişelenme, sorun yok.

Nesnenin çocuklarının herhangi birinin oyuncak olup olmadığını belirtmek için bir sütun görüntülemek üzere, ParentAdmin sınıfında başka bir yöntem tanımlayın ve daha önce olduğu gibi list_display'a ekleyin.

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 

Ayar boolean=True o boolean alanlar için yaptığı gibi Django 'açık' veya 'kapalı' simgeleri hale anlamına gelir. Bu yaklaşımın, ebeveyn başına bir sorgu gerektirdiğini unutmayın (ör. O (n)). Üretimde kabul edilebilir performans gösterip göstermediğinizi görmek için test etmeniz gerekir.

+0

Cevabınız için teşekkürler, gerçekten bana çok yardımcı oldu. Django'nun değişmeyen bağlantı özelliği için daha zarif bir yolu olmadığı konusunda şaşırdım. Her neyse, yardımlarınız şimdi bütün sorunlarımı çözdü. –

İlgili konular