Django不支持从list_display或list_filter获取外键值(例如foo__bar)。我知道你可以创建一个模块方法作为list_display的变通方法,但是我如何为list_filter做同样的事情呢?感谢。
答案 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中):
答案 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以来的自定义过滤器。
更多信息:
答案 5 :(得分:1)
我遇到了同样的问题,确实需要一个解决方案。我有一个解决方法,允许您在FK相关的模型属性上创建过滤器。您甚至可以遍历多个FK关系。它创建了一个新的FilterSpec子类,该子类是用于为ForeignKey字段提供过滤器的默认RelatedFilterSpec的子类。