Django:list_filter和外键字段

时间:2010-01-14 15:10:25

标签: django list filter foreign-keys

Django不支持从list_display或list_filter获取外键值(例如foo__bar)。我知道你可以创建一个模块方法作为list_display的变通方法,但是我如何为list_filter做同样的事情呢?感谢。

6 个答案:

答案 0 :(得分:24)

Django支持带有外键字段的list_filter

# models.py:
class Foo(models.Model):
    name = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

class Bar(models.Model):
    name = models.CharField(max_length=255)
    foo = models.ForeignKey(Foo)

# admin.py:
class BarAdmin(admin.ModelAdmin):
    list_filter = ('foo__name')

来自文档:list_filter中的字段名称也可以使用__ lookup

来跨越关系

答案 1 :(得分:12)

嗯,文档说您可以在ForeignKey中使用list_filter字段类型:

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

一个例子:

# models.py:
class Foo(models.Model):
    name = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

class Bar(models.Model):
    name = models.CharField(max_length=255)
    foo = models.ForeignKey(Foo)

# admin.py:
class BarAdmin(admin.ModelAdmin):
    list_filter = ('foo')

如果你想通过相关模型中的字段进行过滤,那么可以使用补丁来实现这项工作(可能会合并到1.2中):

http://code.djangoproject.com/ticket/3400

答案 2 :(得分:3)

此页面的解决方案为我http://www.hoboes.com/Mimsy/hacks/fixing-django-124s-suspiciousoperation-filtering/

工作

定义

class SmarterModelAdmin(admin.ModelAdmin):
    valid_lookups = ()
    def lookup_allowed(self, lookup, *args, **kwargs):
        if lookup.startswith(self.valid_lookups):
            return True
         return super(SmarterModelAdmin, self).lookup_allowed(lookup, *args, **kwargs)

然后允许查找某些外键字段

class PageAdmin(SmarterModelAdmin):
   valid_lookups = ('parent')

答案 3 :(得分:2)

如果您手动构建更改列表的URL,那么Django跟随关系没有问题。例如:

/admin/contact/contact/?participant__event=8

/admin/contact/contact/?participant__event__name__icontains=er

两者都可以正常工作(虽然后者不会添加'distinct()'因此可能会有重复项,但对于过滤器来说通常不会出现问题)

因此,您只需要在页面中添加一些能够创建正确链接的内容。您可以通过覆盖更改列表模板或编写自定义filterspec来执行此操作。我通过谷歌搜索找到了几个例子 - 特别是Django Snippets

答案 4 :(得分:2)

您可以通过覆盖django.contrib.admin.SimpleListFilter类来轻松创建自Django 1.4以来的自定义过滤器。

更多信息:

  1. Admin list_filter documentation;
  2. Django-1.4 release note

答案 5 :(得分:1)

我遇到了同样的问题,确实需要一个解决方案。我有一个解决方法,允许您在FK相关的模型属性上创建过滤器。您甚至可以遍历多个FK关系。它创建了一个新的FilterSpec子类,该子类是用于为ForeignKey字段提供过滤器的默认RelatedFilterSpec的子类。

请参阅http://djangosnippets.org/snippets/2260/