Django:在Django Admin中过滤或显示模型方法 [英] Django: Filtering or displaying a model method in Django Admin

查看:701
本文介绍了Django:在Django Admin中过滤或显示模型方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我想设置一个管理过滤器,允许用户在未到期和任何



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



AdminForm中的字段或过滤器参数不是自动的。



这样的事情是可能的,如果没有,什么是明智的工作...



我甚至可以自由删除过期行,但我不知道如何启动该路径。

解决方案

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



 code> class NotExpiredExampleAdmin(models.ModelAdmin):
def queryset(self,request):
return(super(ExampleAdmin,self).queryset(request)
.filter

$ b class ExpiredExampleAdmin(models.ModelAdmin):
def queryset(self,request):
return(super(ExampleAdmin,self))查询(请求)
.filter(expiration__lt = dat e.today()))

admin.site.register(ExampleModel,NotExpiredExampleAdmin)
admin.site.register(ExpiredExampleModelProxy,ExpiredExampleAdmin)

而不是自定义 ModelAdmin.queryset ,您还可以定义模型的自定义管理器以获得相同的过滤外部管理员。



另请参见




I have a model with an expiration DateField.

I want to set up an Admin filter that will allow the user to toggle between "Not Expired" and "Any".

The model method is quite a simple Date comparison, no problem.

However assigning this as a field or filter parameter in the AdminForm is not automatic.

Is such a thing possible, and if not, what would be a wise work-around...

I would even be open to some sort of automated deletion of Expired rows, but I don't know how to start down that path.

解决方案

You could include the model twice on the admin site by registering two ModelAdmin classes for it. You can override the queryset() method of the ModelAdmin to customize which instances are shown. Note that you need to define a model proxy and use that in the second ModelAdmin class, otherwise Django complains about registering the same model twice.

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)

Instead of customizing ModelAdmin.queryset you could also define custom managers for the models to get the same filtering outside admin as well.

See also

这篇关于Django:在Django Admin中过滤或显示模型方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆