2010-01-14 89 views
14

Django不支持從list_display或list_filter(例如foo__bar)獲取外鍵值。我知道你可以創建一個模塊方法作爲list_display的解決方法,但我將如何去做相同的list_filter?謝謝。Django:list_filter和外鍵字段

+1

似乎使用1.2版本之前支持這一功能,Django的關係。 4。我不知道他們爲什麼現在禁用它。 – 2011-02-10 05:20:37

回答

11

好,文檔說,你可以可以在list_filter使用ForeignKey字段類型:

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

+1

謝謝。儘管我正在尋找解決方法,而不是修補程序。對不起,沒有指定。 – Dan 2010-01-14 16:26:50

+5

此功能不再有效。外鍵字段不會在側欄上呈現 - 就好像您沒有指定它們一樣。 – 2012-07-20 23:04:10

2

如果您手動構建更改列表的URL,那麼Django在關係之後沒有問題。例如:

/admin/contact/contact/?participant__event=8 

/admin/contact/contact/?participant__event__name__icontains=er 

都工作得不錯(儘管後者不加「不同的()」,所以可能有重複但通常不會對過濾器的問題)

所以你只需要添加一些東西到創建正確鏈接的頁面。您可以通過覆蓋更改列表模板或編寫自定義filterspec來完成此操作。有幾個例子,我通過谷歌搜索 - 特別是在Django Snippets

1

我遇到了同樣的問題,真的需要一個解決方案。我有一個解決方法,可以讓您在FK相關模型屬性上創建過濾器。你甚至可以穿越一個以上的FK關係。它創建一個新的FilterSpec子類,該子類用於在ForeignKey字段上爲您提供過濾器的默認RelatedFilterSpec的子類。

查看從此頁http://djangosnippets.org/snippets/2260/

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') 
+0

通過「('parent')」是否指「元組('parent')」。如果不是,則刪除括號。 – 2012-10-03 09:19:06

18

Django支持與國外重點領域

# 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:在list_filter字段名也可以跨越使用__查找

+0

這是使用Django 1.6爲我工作的解決方案。 – Pengo 2015-01-23 17:43:37