2012-10-11 34 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

更好的解决方案,因为它不需要污染你的模型与管理相关的东西。 –