Django:在Django Admin中过滤或显示模型方法

M. *_*yan 2 django django-models django-admin

我有一个带有过期DateField的模型.

我想设置一个Admin过滤器,允许用户在"Not Expired"和"Any"之间切换.

模型方法相当简单,日期比较,没问题.

但是,在AdminForm中将其指定为字段或过滤器参数不是自动的.

这样的事情是否可能,如果不是,那将是一个明智的解决方案......

我甚至会开放某种自动删除过期行,但我不知道如何开始这条路.

aka*_*ola 5

您可以通过为管理站点注册两个ModelAdmin类来在管理站点上包含该模型两次.您可以覆盖自定义显示哪些实例的queryset()方法ModelAdmin.请注意,您需要定义模型代理并在第二个ModelAdmin类中使用它,否则Django会抱怨两次注册相同的模型.

models.py

class ExampleModel(models.Model):
    expired = models.DateField()

class ExpiredExampleModelProxy(ExampleModel):
    class Meta:
        proxy = True
        verbose_name = 'Expired Example'
        verbose_name_plural = 'Expired Examples'
Run Code Online (Sandbox Code Playgroud)

admin.py

class NotExpiredExampleAdmin(models.ModelAdmin):
    def queryset(self, request):
        return (super(ExampleAdmin, self).queryset(request)
                .filter(expiration__gte=date.today()))

class ExpiredExampleAdmin(models.ModelAdmin):
    def queryset(self, request):
        return (super(ExampleAdmin, self).queryset(request)
                .filter(expiration__lt=date.today()))

admin.site.register(ExampleModel, NotExpiredExampleAdmin)
admin.site.register(ExpiredExampleModelProxy, ExpiredExampleAdmin)
Run Code Online (Sandbox Code Playgroud)

除了自定义之外,ModelAdmin.queryset您还可以为模型定义自定义管理器,以便在管理员之外获得相同的过滤.

也可以看看