python - Django 管理日期范围过滤器

标签 python django django-admin

我正在尝试为 Django 管理员编写一个客户日期范围字段。这是我的过滤器,与docs中提供的十年示例非常相似。但不适合我。我究竟做错了什么?它只显示每个选择的所有记录。

class DaysSinceAdvertFilter(admin.SimpleListFilter):
    # Human-readable title which will be displayed in the
    # right admin sidebar just above the filter options.
    title = _('Days Since Advert')

    # Parameter for the filter that will be used in the URL query.
    parameter_name = 'last_advert'

    def lookups(self, request, model_admin):
        """
        Returns a list of tuples. The first element in each
        tuple is the coded value for the option that will
        appear in the URL query. The second element is the
        human-readable name for the option that will appear
        in the right sidebar.
        """
        return (
            ('0', _('Less than 7 days')),
            ('7', _('7-13 days')),
            ('14', _('14-20 days')),
            ('21', _('21-27 days')),
            ('28', _('28-34 days')),
            ('35', _('35+ days')),
        )

    def queryset(self, request, queryset):
        """
        Returns the filtered queryset based on the value
        provided in the query string and retrievable via
        `self.value()`.
        """
        # Compare the requested value to decide how to filter the queryset.
        today = datetime.date.today()
        if self.value() == '0':
            return queryset.filter(last_advert__gte=today - datetime.timedelta(days=6))
        if self.value() == '7':
            return queryset.filter(last_advert__gte=today - datetime.timedelta(days=13),
                                   last_advert__lte=today - datetime.timedelta(days=7))
        if self.value() == '14':
            return queryset.filter(last_advert__gte=today - datetime.timedelta(days=20),
                                   last_advert__lte=today - datetime.timedelta(days=14))
        if self.value() == '21':
            return queryset.filter(last_advert__gte=today - datetime.timedelta(days=27),
                                   last_advert__lte=today - datetime.timedelta(days=21))
        if self.value() == '28':
            return queryset.filter(last_advert__gte=today - datetime.timedelta(days=34),
                                   last_advert__lte=today - datetime.timedelta(days=28))
        if self.value() == '35':
            return queryset.filter(last_advert__lte=today - datetime.timedelta(days=35))

last_advert 是一个 models.DateField

最佳答案

您可以简单地使用last_advert__range 为您的范围创建一个字典,与您在 lookups() 中创建的元组相同 像这样的事情

 no_of_routes_dict = {
    '7': [14, 20]}

queryset()

filt_no_of_routes=request.GET.get['para']
`last_advert__range`= no_of_routes_dict[filt_no_of_routes]

这可能有帮助

class NumberOfRoutesFilter(SimpleListFilter):
title = 'Date Range'
parameter_name = 'date-range'
date_dict = {
    '0': [0, 7],
    '7': [7, 13],
    '14': [14, 20],
    '21': [21, 27],

}

def lookups(self, request, model_admin):
    return [
       ('0', 'Less than 7 days'),
        ('7', '7-13 days'),
        ('14', '14-20 days'),
        ('21', '21-27 days')
    ]

def queryset(self, request, queryset):
    filt_date = request.GET.get('date-range')
    if filt_date:
        return queryset.filter(
            last_advert__range=self.date_dict[filt_date]
        )
    return queryset

关于python - Django 管理日期范围过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113894/

相关文章:

python - Python运行spark的问题

django celery 获取类型错误 : 'tuple' object is not callable

python - 如何同时在模式和无模式模式下使用Django HStore DictionaryField?

django - 自定义 Django 管理索引页面以显示模型对象

python - 子进程未按预期返回数据

python - 在 Python 中从空格分隔的 key=value 字符串创建字典

Python - 错误 - 无法将数据写入流 : <open file '<stdout>' , 模式 'w' 在 0x104c8f150>

python - 通过 Django REST Framework list_route 使用单个 URL 进行 GET 和 POST

python - Django 表格 : how to display media (javascript) for a DateTimeInput widget?

python - 如何通过 CherryPy 摘要身份验证获取用户名