【问题标题】:list_filter in admin管理员中的 list_filter
【发布时间】:2009-05-13 08:47:50
【问题描述】:
DECOM_CHOICES = (
    ('N', 'No'),
    ('Y', 'Yes'),
)

class Host(models.Model):
    hostname = models.CharField(max_length=36, unique=True)
    decommissioned = models.CharField(max_length=1, choices=DECOM_CHOICES, default='N')
    ip_address = models.IPAddressField()
    def __unicode__(self):
        return self.hostname

class HostAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Host Info', {'fields': ['hostname','decommissioned','ip_address']}),
    list_display = ('hostname', 'ip_address', 'decommissioned')
    list_filter = ('decommissioned')

现在有什么办法可以让我将停用的过滤器默认设置为'N',而不是'All'

【问题讨论】:

标签: django django-admin


【解决方案1】:

我通过在将请求对象中的 GET 数据传递给changelist_view() 之前修改它来做到这一点。不优雅,但很有效。

class MyModelAdmin(admin.ModelAdmin):    
    def changelist_view(self, request, extra_context=None):
        if not request.GET.has_key('decommissioned__exact'):
            q = request.GET.copy()
            q['decommissioned__exact'] = 'N'
            request.GET = q
            request.META['QUERY_STRING'] = request.GET.urlencode()
        return super(MyModelAdmin,self).changelist_view(request, extra_context=extra_context)

注意:我没有在这里尝试过这个确切的代码,但你应该明白了。

【讨论】:

  • 有什么方法可以使“全部”链接与您的解决方案一起使用?
【解决方案2】:

看起来您使用的代码几乎完全来自Django ticket,它在注释中有一个解决方法来设置默认过滤器值。目前还没有一种特别优雅的方式来做到这一点。

顺便说一句 - 使用布尔字段不是更好吗,因为你存储的是或否?

【讨论】:

    【解决方案3】:

    if ('HTTP_REFERER' in request.META) and (request.META['HTTP_REFERER'].find('?') == -1) and (not request.GET.has_key('status__exact')):

    使用这个保存条件而不是上面由'gerdemb'给出的解决方案中给出的,这样所有的也可以被选中

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2011-10-08
      • 2019-03-12
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      相关资源
      最近更新 更多