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

时间:2009-12-07 18:20:46

标签: django django-models django-admin

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

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

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

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

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

我甚至愿意自动删除过期的行,但我不知道如何开始这条路。

1 个答案:

答案 0 :(得分:5)

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

models.py

ModelAdmin

admin.py

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

class ExpiredExampleModelProxy(ExampleModel):
    class Meta:
        proxy = True
        verbose_name = 'Expired Example'
        verbose_name_plural = 'Expired Examples'

您也可以为模型定义自定义管理器,以便在管理员外部进行相同的过滤,而不是自定义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)

另见