2011-03-18 45 views
2

我有一個模型:抑制list_filter可能的過濾器,非空的

class Foo(models.Model): 
    attribute = models.IntegerField() 
    user = models.ForeignKey(user) 

和模型管理:

class FooAdmin(admin.ModelAdmin): 
    list_filter = ('attribute',) 

在管理,我只是顯示的富對象活躍的用戶,但屬性過濾器給我所有可能的屬性,即使那些不返回任何對象的用戶。最後,我有很多不同的過濾器值,其中大部分對用戶來說都沒有用處。我如何限制那些過濾器值與用戶匹配的值。

希望這是可以理解的

乾杯

解決方案: 在您的應用程序投放的admin.py:

from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec 
from django.contrib.auth.models import User 
from sets import Set 

class CustomChoiceFilterSpec(ChoicesFilterSpec): 

    def __init__(self, f, request, params, model, model_admin): 
     super(CustomChoiceFilterSpec, self).__init__(f, request, params, model, 
                model_admin) 
    self.lookup_kwarg = '%s__attribute__exact' % f.name 
    self.lookup_val = request.GET.get(self.lookup_kwarg, None) 
    self.objects = list(Set([i.attribute for i in model.objects.filter(foo__user = request.user)])) # This is the magic line :) ! 

    def choices(self, cl): 
     yield {'selected': self.lookup_val is None, 
       'query_string': cl.get_query_string({}, [self.lookup_kwarg]), 
       'display': ('All')} 
     for val in self.objects: 
      yield {'selected': smart_unicode(val) == self.lookup_val, 
        'query_string': cl.get_query_string({self.lookup_kwarg: val.attribute}), 
        'display': val.attribute} 

    def title(self): 
     return "Attribute" 
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'compact_filter', False), CustomChoiceFilterSpec)) 

的最後一行說,這種類型的過濾器將只適用到具有'compact_filter'作爲屬性的對象。

所以我們把我們的模型美孚(models.py):

attribute.compact_filter = True 
+0

你找到一個解決辦法?它以前如何?我計劃在晚上晚些時候給出這個拍攝 – 2011-03-18 22:53:34

+1

你很高興在解決問題後發佈你的解決方案 – 2011-06-02 06:03:06

回答

1

不幸的是,重寫這些list_filters並不容易。

有一個關於編寫我們自己的列表篩選大量的進步,你可以看到這張票:http://code.djangoproject.com/ticket/5833但不會使其成爲1.3。

我所能建議的就是開始使用這個新詞彙:「FilterSpec」來查找來自不同人的代碼片斷,這些人能夠在SO和Google上運行自定義的FilterSpecs。

Custom Filter in Django Admin on Django 1.3 or below
http://djangosnippets.org/snippets/1051/

我將與FilterSpecs以此爲契機,勾搭嘍!

0
list_filter = ['attribute_1', 'attribute_2'] 

設置,彌補了管理

list_display = ('attribute_1', 'attribute_2')

套機的屬性過濾器在管理視圖表中顯示您的特定模型。

如果這些都已經正確輸入,我敢肯定你會已經嘗試重新啓動本地開發服務器和/或Apache,這取決於你的服務器上本地或直接開發應用程序。對代碼文件的更改只有在重新編譯後纔會生效,這會在文件被導入或直接調用時發生。如果您沒有重新啓動服務器,則該文件可能未被重新編譯,因此可能沒有發生更改。

我相信你已經在模型文件中寫了你的模型,並且在admin.py文件中的admin的過濾器?

+0

什麼是attribute_1和attribute_2?我在服務器上工作,重新啓動它,將模型放在models.py中,並在admin.py/Ok中過濾。假設我有3個不同的字段屬性值(attribute_1,...)。活動用戶只有屬性1和屬性2的記錄。我想僅顯示attribute_1和attribute_2而不顯示attribute_3,因爲它對用戶無用 – 2011-03-18 21:28:00

相關問題