Django - 来自同一型号的两个部分

时间:2017-01-17 18:13:48

标签: django

我有'网站'我的管理页面中的部分。这是我的models.py:

的一部分
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 个答案:

答案 0 :(得分:1)

您可以通过注册proxy model的管理页面并覆盖get_queryset method of the registered ModelAdmin来实现此目的。

您只能在管理站点中注册一次对象,因此代理模型充当要单独注册的新模型。由于它只是一个代理模型,它的存在只会影响Python代码,并且不会在数据库中创建新模型。

get_queryset命令是ModelAdmin获取要显示的模型实例的方式,因此通过覆盖它我们可以添加我们想要的任何过滤。

在您的情况下,您可以在应用中的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)