如何在django admin中显示布尔属性

Gar*_*Jax 27 django

众所周知,通过设置属性可以轻松地在Django管理员中显示方法返回值为boolean boolean:

class MyModel(models.Model):
    def is_something(self):
        if self.something == 'something':
            return True
        return False
    is_something.boolean = True
Run Code Online (Sandbox Code Playgroud)

如何在财产上实现同样的效果,例如以下情况?

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

Gar*_*Jax 27

等待更好的解决方案出现,我已经通过以下方式解决了这个问题:

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)
Run Code Online (Sandbox Code Playgroud)

然后我将_is_somethingModelAdmin子类中引用该方法:

class MyModelAdmin(admin.ModelAdmin):
    list_display = ['_is_something']
Run Code Online (Sandbox Code Playgroud)

is_something财产,否则:

if my_model_instance.is_something:
    print("I'm something")
Run Code Online (Sandbox Code Playgroud)

  • 使用 django-jet 我遇到了这个问题,它与 CSS 不显示图标有关,具体取决于主题 https://github.com/geex-arts/django-jet/issues/300 (2认同)

小智 23

这是我在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']
Run Code Online (Sandbox Code Playgroud)

  • 更好的解决方案,因为它不需要使用管理相关的东西污染您的模型. (2认同)

Pet*_*ter 7

您需要为shadowing模型中的属性创建一个函数。我的意思是,您将需要在ModelAdmin类中重新创建一个函数,该函数的名称与主Model中定义的属性相同。

例:

# Model
class Product(models.Model):

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

...

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

    in_stock.boolean = True        
Run Code Online (Sandbox Code Playgroud)