我有一个带有过期DateField的模型。
我想设置一个Admin过滤器,允许用户在“Not Expired”和“Any”之间切换。
模型方法相当简单,日期比较,没问题。
但是,在AdminForm中将其指定为字段或过滤器参数不是自动的。
这样的事情是否可能,如果没有,那将是一个明智的解决方案......
我甚至愿意自动删除过期的行,但我不知道如何开始这条路。
答案 0 :(得分:5)
您可以通过为其注册两个ModelAdmin
类,在管理网站上包含该模型两次。您可以覆盖queryset()
的{{1}}方法来自定义显示的实例。请注意,您需要定义模型代理并在第二个ModelAdmin
类中使用它,否则Django会抱怨两次注册相同的模型。
ModelAdmin
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)
。
另见