Как отобразить логическое свойство в администраторе django
Как мы все знаем, отображение возвращаемого значения метода в качестве логического элемента в администраторе Django легко выполняется установкой атрибута boolean
:
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
Ответы
Ответ 1
Ожидая появления лучших решений, я решил это следующим образом:
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")
Ответ 2
это самый простой способ, который я нашел, непосредственно в 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']
Ответ 3
Если вы определяете 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