36

ご存知のとおり、Django adminでメソッド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
4

5 に答える 5

39

これは、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']
于 2016-12-14T15:40:43.813 に答える
35

より良い解決策が現れるのを待って、私は次の方法でそれを解決しました:

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")
于 2012-10-11T14:42:10.773 に答える
15

shadowingモデルのプロパティに関数を作成する必要があります。つまり、メインのモデルで定義されているプロパティと同じ名前の関数をModelAdminクラスに再作成する必要があります。

例:

# Model
class Product(models.Model):

    @property  # you can omit this decorator if you will access this property as a method of the model instance
    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        
于 2018-06-26T23:21:42.720 に答える
3

このようなデコレータを作成できます

from six.moves import reduce

def list_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 = [list_property("is_something", boolean=True)]

modeladminの読み取り専用フィールドの場合、代わりにこのデコレータを使用できます。

def field_property(field_name, **kwargs):
    def _from_property(admin, obj=None):
        if not obj:
            return None
        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

# admin
class MyModelAdmin(admin.ModelAdmin):
    readonly_fields = ["is_something"]

    is_something = field_property("is_something", boolean=True)
于 2019-03-19T05:42:44.353 に答える
-1

プロパティとして定義する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
于 2012-10-11T15:44:36.047 に答える