2012-10-11 33 views
17

大家都知道,在Django管理顯示方法返回值作爲布爾容易通過設置boolean屬性來完成:如何在Django管理顯示布爾屬性

class MyModel(models.Model): 
    def is_something(self): 
     if self.something == 'something': 
      return True 
     return False 
    is_something.boolean = True 

你怎麼能這樣爲一個屬性達到相同的效果,就像在下面的情況下一樣?

class MyModel(models.Model): 
    @property 
    def is_something(self): 
     if self.something == 'something': 
      return True 
     return False 

回答

16

。等待更好的解決方案拿出來,我已經解決它以下列方式:

class MyModel(models.Model): 
    def _is_something(self): 
     if self.something == 'something': 
      return True 
     return False 
    _is_something.boolean = True 
    is_something = property(_is_something) 

我再引用_is_something方法在ModelAdmin子類:

class MyModelAdmin(admin.ModelAdmin): 
    list_display = ['_is_something'] 

另外is_something財產:

if my_model_instance.is_something: 
    print("I'm something") 
-1

如果將is_something定義爲一個屬性,它將是一個不可變對象,而不是一個函數,但該對象包含對fget屬性中裝飾獲取器的引用。我認爲,Django管理界面使用該屬性的getter,因此這或許工作

class MyModel(models.Model): 
    @property 
    def is_something(self): 
     if self.something == 'something': 
      return True 
     return False 
    is_something.fget.boolean = True 
+3

可悲的是它不工作。 :-( – GaretJax

+0

)你在list_display中放了什麼?如果你放入is_something.fget(但我認爲這與你的解決方案非常接近),它可能會工作。 – esauro

+2

也不管用,Django明確表示不允許這樣做。 ) – GaretJax

15

這是我發現的最簡單的方法,直接在的ModelAdmin:

class MyModelAdmin(admin.ModelAdmin): 
    def is_something(self, instance): 
     return instance.something == "something" 
    is_something.boolean = True 
    is_something.short_description = u"Is something" 

    list_display = ['is_something'] 
+0

適用於我,但我需要將'list_display = ['is_something']'更改爲'list_display = ['_is_something']'並將@屬性添加到我的模型函數中以進行工作。 – xtornasol512

+0

如果你之前用'is_something()'調用此方法,現在你需要調用它而不需要parentesis'is_something' – xtornasol512

+2

更好的解決方案,因爲它不需要污染你的模型與管理相關的東西。 –