2012-10-11 25 views
17

Como todos sabemos, mostrando una método valor de retorno como booleano en la administración de Django se hace fácilmente estableciendo el atributo boolean:Cómo mostrar una propiedad booleana en la administración de Django

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

Cómo se puede lograr el mismo efecto para una propiedad, como en el siguiente caso?

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

Respuesta

16

espera de mejores soluciones para llegar, he resuelto de la siguiente manera:

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) 

voy a continuación, hacer referencia al método _is_something en el ModelAdmin subclase:

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

Y la propiedad is_something de lo contrario:

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

Si define is_something como una propiedad, será un objeto inmutable, en lugar de una función, pero ese objeto contiene una referencia al getter decorado en el atributo fget. Creo que la interfaz de administración de Django utiliza el captador de esa propiedad, por lo que este funciona de mayo

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

Lamentablemente no funciona . :-( – GaretJax

+0

¿Qué pones en list_display? Puede funcionar si pones is_something.fget (pero creo que esto está muy cerca de tu solución) – esauro

+2

No funciona tampoco, Django explícitamente no permite eso. Voy a marcar mi solución como aceptado entonces, gracias de todos modos;) – GaretJax

15

esta es la forma más sencilla que he encontrado, directamente en la 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

Funciona para mí, pero tengo que cambiar 'list_display = ['is_something']' a 'list_display = ['_is_something']' y agregar '@ property' a la función de mi modelo para trabajar . – xtornasol512

+0

Y tenga cuidado si llama a este método antes con 'is_something()' ahora necesita llamarlo sin parentesis 'is_something' – xtornasol512

+2

Solución mucho mejor ya que no requiere contaminar su modelo con cosas relacionadas con el administrador. –

Cuestiones relacionadas