【问题标题】:Django: Filtering or displaying a model method in Django AdminDjango:在 Django Admin 中过滤或显示模型方法
【发布时间】:2009-12-07 18:20:46
【问题描述】:

我有一个带有过期日期字段的模型。

我想设置一个管理员过滤器,允许用户在“未过期”和“任何”之间切换。

模型方法是比较简单的日期比较,没问题。

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

这样的事情可能吗,如果没有,什么是明智的解决方法...

我什至愿意对 Expired 行进行某种自动删除,但我不知道如何开始。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您可以通过为其注册两个ModelAdmin 类在管理站点上包含该模型两次。您可以覆盖ModelAdminqueryset() 方法来自定义显示哪些实例。请注意,您需要定义一个模型代理并在第二个 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'
    

    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)
    

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

    另见

    【讨论】:

    • 太棒了。谢谢你的智慧。
    • 我有模型 X 和代理模型 Y,还有模型 A 和代理模型 BA 有一个指向X 的外键,当管理员中的某个人正在编辑A 时,它会给他们一个绿色的小加号来添加模型X,或者从列表中选择一个。我想要的是当他们编辑代理模型B 时,我希望那个小加号弹出页面到X 的代理模型Y。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2019-12-04
    • 2021-06-06
    • 2017-09-14
    • 2011-10-17
    • 2016-04-23
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多