【问题标题】:Add 'yesterday' field to Django admin date list filter将“昨天”字段添加到 Django 管理日期列表过滤器
【发布时间】:2018-02-09 14:05:54
【问题描述】:

在我的 Django 应用程序中,在管理员中,对于我的一个模型,我允许选择按其“create_date”字段进行过滤。 Django 默认为我提供了一些选项(今天、过去 7 天、本月、今年)。我也想简单地添加选择“昨天”的选项。我查看了有关同一问题的其他堆栈溢出问题,但他们都在寻找按日期范围搜索的能力,我只想要一个预加载选项。他们是在管理类中配置此模型以覆盖其某些过滤器功能的一种方式吗?

管理类

class User_LikeAdmin(admin.ModelAdmin):
    def fb_view_link(self, obj):
        if len(obj.user_facebook_link) > 2:
            return u"<a href='%s' target='_blank'>Facebook Page</a>" % obj.user_facebook_link
        else:
            return ""

    fb_view_link.short_description = ''
    fb_view_link.allow_tags = True


    list_display = ('vehicle', 'user', 'fb_view_link', 'dealer', 'create_date')
    list_filter = ('create_date', ('vehicle__dealer', custom_titled_filter('Dealer')))
    raw_id_fields = ('vehicle', 'user')

    actions = [export_csv]

    def dealer(self, obj):
        return obj.vehicle.dealer

【问题讨论】:

    标签: django date filter admin


    【解决方案1】:

    作为一个选项,您可以使用documentation 中提到的自定义过滤器类

    class User_LikeAdmin(admin.ModelAdmin):
        list_filter = (('create_date', CustomDateFieldListFilter),)
    

    你可以扩展DateFieldListFilter

    from django.contrib.admin.filters import DateFieldListFilter
    
    class CustomDateFieldListFilter(DateFieldListFilter):
        # Your tweaks here
    

    【讨论】:

      【解决方案2】:
      import datetime
      from django.contrib.admin import DateFieldListFilter
      
      
      class DateYesterdayFieldListFilter(DateFieldListFilter):
          def __init__(self, *args, **kwargs):
              super().__init__(*args, **kwargs)
      
              today = datetime.date.today()
              yesterday = today - datetime.timedelta(days=1)
      
              self.links = list(self.links)
              self.links.insert(2, ('Yesterday', {
                  self.lookup_kwarg_since: str(yesterday),
                  self.lookup_kwarg_until: str(today),
              }))
      

      【讨论】:

        【解决方案3】:

        使用日期时间,并创建昨天的变量,然后通过这种方式获取所有记录。

        import datetime
        yesterday = datetime.date.today() - datetime.timedelta(days=1)
        
        data = Modelname.objects.filter(create_date=yesterday)
        

        【讨论】:

          【解决方案4】:

          我对@d2718nis 的回答:

          class DateFilter(DateFieldListFilter):
              def __init__(self, field, request, params, model, model_admin, field_path):
                  super().__init__(field, request, params, model, model_admin, field_path)
          
                  now = timezone.now()
                  if timezone.is_aware(now):
                      now = timezone.localtime(now)
          
                  if isinstance(field, models.DateTimeField):
                      today = now.replace(hour=0, minute=0, second=0, microsecond=0)
                  else:       # field is a models.DateField
                      today = now.date()
          
                  yesterday = today - datetime.timedelta(days=1)
          
                  links_start = self.links[:2]  # anyday and today
                  link_yesterday = (_('Yesterday'), {
                          self.lookup_kwarg_since: str(yesterday),
                          self.lookup_kwarg_until: str(today),
                      })
          
                  self.links = (*links_start, link_yesterday, *self.links[2:])
          

          【讨论】:

            猜你喜欢
            • 2013-04-15
            • 2010-12-15
            • 2022-07-06
            • 2021-05-27
            • 2018-06-11
            • 1970-01-01
            • 2018-01-14
            • 2011-11-16
            • 2017-06-26
            相关资源
            最近更新 更多