Django 1.3或更低版本上Django Admin中的自定义过滤器

如何向django admin(模型仪表板右侧显示的过滤器)添加自定义过滤器?我知道很容易包含基于该模型字段的过滤器,但是像这样的“计算”字段呢:

class NewsItem(models.Model):

headline = models.CharField(max_length=4096, blank=False)

byline_1 = models.CharField(max_length=4096, blank=True)

dateline = models.DateTimeField(help_text=_("date/time that appears on article"))

body_copy = models.TextField(blank=False)

when_to_publish = models.DateTimeField(verbose_name="When to publish", blank=True, null=True)

# HOW CAN I HAVE "is_live" as part of the admin filter? It's a calculated state!!

def is_live(self):

if self.when_to_publish is not None:

if ( self.when_to_publish < datetime.now() ):

return """ <img alt="True" src="/media/img/admin/icon-yes.gif"/> """

else:

return """ <img alt="False" src="/media/img/admin/icon-no.gif"/> """

is_live.allow_tags = True

class NewsItemAdmin(admin.ModelAdmin):

form = NewsItemAdminForm

list_display = ('headline', 'id', 'is_live')

list_filter = ('is_live') # how can i make this work??

回答:

感谢gpilotino为我提供了实现正确方向的推动力。

我注意到该问题的代码正在使用datetime来确定其生效时间。因此,我使用了DateFieldFilterSpec并将其子类化。

from django.db import models

from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec,DateFieldFilterSpec

from django.utils.encoding import smart_unicode

from django.utils.translation import ugettext as _

from datetime import datetime

class IsLiveFilterSpec(DateFieldFilterSpec):

"""

Adds filtering by future and previous values in the admin

filter sidebar. Set the is_live_filter filter in the model field attribute

'is_live_filter'. my_model_field.is_live_filter = True

"""

def __init__(self, f, request, params, model, model_admin):

super(IsLiveFilterSpec, self).__init__(f, request, params, model,

model_admin)

today = datetime.now()

self.links = (

(_('Any'), {}),

(_('Yes'), {'%s__lte' % self.field.name: str(today),

}),

(_('No'), {'%s__gte' % self.field.name: str(today),

}),

)

def title(self):

return "Is Live"

# registering the filter

FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'is_live_filter', False),

IsLiveFilterSpec))

要使用它,你可以将上面的代码放入filters.py中,并将其导入要添加过滤器的模型中

以上是 Django 1.3或更低版本上Django Admin中的自定义过滤器 的全部内容, 来源链接: utcz.com/qa/402969.html

回到顶部