2012-10-11 13 views
17

Jak wszyscy wiemy, wyświetlając metody wartość zwracaną jako wartość logiczną w panelu administracyjnym jest łatwo zrobić poprzez ustawienie atrybutu boolean:Jak wyświetlić właściwości Boolean w admin django

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

Jak można osiągnąć taki sam efekt dla nieruchomości, jak w poniższym przypadku?

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

Odpowiedz

16

czekając na lepsze rozwiązania wymyślić, mam rozwiązać go w następujący sposób:

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) 

będę następnie odwołać metody _is_something w ModelAdmin podklasy:

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

A atrybut is_something w przeciwnym razie:

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

Jeśli zdefiniujesz is_something jako właściwość, będzie to obiekt niezmienny, zamiast funkcji, ale ten obiekt zawiera odniesienie do dekorowanego gettera w atrybucie fget. Myślę, że interfejs administracyjny Django używać getter tej nieruchomości, a zatem ten maj działa

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

Niestety to nie działa . :-( – GaretJax

+0

Co umieściłeś na liście wyświetlania_pliku? Może to działać, jeśli umieścisz plik is_something.fget (ale myślę, że jest to bardzo zbliżone do twojego rozwiązania) – esauro

+2

Nie działa, Django jawnie to uniemożliwia. tak zaakceptowane to, dziękuję i tak;) – GaretJax

15

jest to najprostszy sposób znalazłem, bezpośrednio w 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

Działa dla mnie, ale muszę zmienić 'list_display = ['is_something']' na 'list_display = ['_is_something']' i dodać '@ property' do mojej funkcji modelu do pracy . – xtornasol512

+0

I zachowaj ostrożność, jeśli wywołasz tę metodę wcześniej z 'is_something()' teraz musisz nazwać to bez parentezy 'is_something' – xtornasol512

+2

O wiele lepsze rozwiązanie, ponieważ nie wymaga zanieczyszczania twojego modelu materiałem związanym z adminem. –