반응형
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에 넣고 필터를 추가하려는 모델로 가져올 수 있습니다.
참조 페이지 https://stackoverflow.com/questions/991926
반응형
'파이썬' 카테고리의 다른 글
파이썬 목록에서 요소를 제거하려고 할 때 ValueError를 어떻게 무시할 수 있습니까? (0) | 2020.09.16 |
---|---|
파이썬 Python에서 모듈 가져 오기-모범 사례 (0) | 2020.09.16 |
파이썬 문자열 (변수)이 비어 있는지 확인하는 방법은 무엇입니까? (0) | 2020.09.16 |
파이썬 하위 스레드를 시작할 때 플라스크가 '요청 컨텍스트 외부에서 작동'하는 현상 (0) | 2020.09.16 |
파이썬 Python에서 날짜 범위 만들기 (0) | 2020.09.16 |
댓글