본문 바로가기
파이썬

파이썬 Django 1.3 이하의 Django Admin에서 사용자 지정 필터

by º기록 2020. 9. 16.
반응형

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

 

 

반응형

댓글