Как отобразить логическое свойство в админке 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

Ответы на вопрос(5)

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']
 xtornasol51207 июн. 2017 г., 01:47
И будьте осторожны, если вы вызываете этот метод раньше сis_something() теперь нужно позвонить без парентезаis_something
 xtornasol51207 июн. 2017 г., 01:38
У меня работает, но мне нужно поменятьlist_display = ['is_something'] вlist_display = ['_is_something'] и добавить@property к моей модели функции для работы.
 Sébastien Deprez12 июн. 2017 г., 16:35
Гораздо лучшее решение, так как оно не требует загрязнения вашей модели материалами, связанными с администратором.

Если вы определитеis_something в качестве свойства это будет неизменный объект, а не функция, но этот объект содержит ссылку на декорированный геттер вfget приписывать. Я думаю, что интерфейс администратора Django использует метод получения этого свойства, поэтому это может работать

class MyModel(models.Model):
    @property
    def is_something(self):
        if self.something == 'something':
            return True
        return False
    is_something.fget.boolean = True
 esauro11 окт. 2012 г., 17:52
Что вы положили в list_display? Это может сработать, если вы поместите is_something.fget (но я думаю, что это довольно близко к вашему решению)
 GaretJax11 окт. 2012 г., 17:48
К сожалению, это нет работа. :-(
 GaretJax11 окт. 2012 г., 20:39
Безразлично»Это тоже не работает, Джанго явно запрещает это. Я'тогда я отмечу мое решение как принятое, спасибо, в любом случае;)
Решение Вопроса

я

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")
 Vadorequest11 мар. 2019 г., 21:41
Используя django-jet, я столкнулся с этой проблемой, и это было связано с тем, что CSS не отображал значок в зависимости от темы.github.com/geex-arts/django-jet/issues/300

shadowing функция к свойству в модели. Я имею в виду, что вам нужно будет воссоздать функцию в классе ModelAdmin с тем же именем, что и у свойства, определенного в основной модели.

Пример:

# Model
class Product(models.Model):

    @property  # you can omit this directive
    def in_stock(self):
        # boolean check return
        return self.quantity > 0

...

# Django-modeladmin
class ProductAdmin(admin.ModelAdmin):
    list_display = ('in_stock', ...)
    def in_stock(self, instance):
        return instance.in_stock

    in_stock.boolean = True        

Вы можете создать декоратор с именем from_property

from six.moves import reduce

def from_property(field_name, **kwargs):
    def _from_property(obj):
        rv = reduce(getattr, field_name.split("."), obj)
        return rv() if callable(rv) else rv

    for key, value in kwargs.items():
        setattr(_from_property, key, value)
    return _from_property

Вот ваша модель и определение администратора:

# model

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


# admin

class MyModelAdmin(admin.ModelAdmin):
    list_display = [from_property("is_something", boolean=True)]
 Pascal Polleunus15 мая 2019 г., 09:46
Незначительное улучшение, чтобы иметь один декоратор для обоих случаев:def _from_property(admin_or_obj, obj=None): if not isinstance(admin_or_obj, admin.ModelAdmin): obj = admin_or_obj

Ваш ответ на вопрос