2017-01-17 51 views
0

我的管理頁面中有'網站'部分。這裏是我的models.py的一部分:Django - 來自同一模型的兩個部分

class Site(models.Model): 
    category = models.ForeignKey('Category') 
     subcategory = ChainedForeignKey(
     'Subcategory', 
     chained_field='category', 
     chained_model_field='category', 
     show_all=False, 
     auto_choose=True) 
    name = models.CharField(max_length=70) 
    description = models.TextField() 
    keywords = MyTextField() 
    date = models.DateTimeField(default=datetime.now, editable=False) 
    url = models.URLField() 
    is_active = models.BooleanField(default=False) 

我想補充另一個站點一節中我的管理,這將只顯示活動的站點(IS_ACTIVE = FALSE)。可能嗎? (我的意思是:

Sites - first section (list of all sites) 
Inactive sites (number of inactive sites) - second section (only inactive sites) 

這裏是我的管理類:

class SiteAdmin(admin.ModelAdmin): 
    list_display = ('is_active', 'name', 'description', 'keywords', 'date') 
    fields = ('name', 'url', 'category', 'subcategory', 'description', 
       'keywords', 'date', 'is_active') 
    readonly_fields = ('date',) 
    list_editable = ('is_active',) 
    list_display_links = ('name',) 

回答

1

您可以通過註冊一個管理頁面爲proxy model,並重寫get_queryset method of the registered ModelAdmin實現這一目標。

您只能在管理站點註冊一次對象,因此代理模型可以作爲單獨註冊的新模型。由於它只是一個代理模型,它的存在只會影響Python代碼,並不會在數據庫中創建新模型。

get_queryset命令是如何獲取要顯示的模型實例,因此通過重寫它可以添加我們想要的任何過濾。

在你的情況下,你可以在你的應用中的admin.py文件中添加這樣的內容。

class InactiveSite(Site): 
    class Meta: 
     proxy = True 
     verbose_name_plural = 'Inactive sites' 

class InactiveSiteAdmin(admin.ModelAdmin): 
    def get_queryset(self, request): 
     return self.model.objects.filter(is_active=False) 

admin.site.register(InactiveSite, InactiveSiteAdmin) 
相關問題