【问题标题】:How to display a value where there is none in Django admin?如何在 Django admin 中显示没有的值?
【发布时间】:2012-01-03 04:38:48
【问题描述】:

当没有值时,是否有 Djangotastic 方法可以在管理员中显示字段的默认值?类似于“n/a”,但不将其保存到数据库中?

当我在管理员中将下面模型中的所有字段设置为只读时,前端显示看起来像底部的图像。它在视觉上感觉崩溃了,就像它应该有一个值或一个盒子或其他东西一样。如果没有一种简单的方法来做我正在寻找的事情,那么是否有另一种解决方案可以让用户更清楚地了解前端管理员?

class Package(models.Model):
    packaging_format = models.CharField(max_length=40)
    package_delivery_pattern = models.CharField(max_length=30, blank=True)
    package_delivery_comments = models.CharField(max_length=250, blank=True)
    package_manifest_filename = models.CharField(max_length=50)
    package_description = models.CharField(max_length=250, blank=True)
    package_naming_pattern = models.CharField(max_length=50)

管理中显示的字段屏幕截图:

【问题讨论】:

    标签: django django-models django-admin django-modeladmin


    【解决方案1】:

    发生的情况是,您实际上在 CharFields 中保存了一个空字符串 '' 而不是 None 值(因为 blank=True)。所以 Django-admin 正在显示您保存在数据库中的字符串(在这种情况下,什么都没有)。

    如果您将 CharFields 更改为 null=True 而不是 blank=True,您将在数据库中保存 NULL 而不是空字符串。这样,你就会得到你想要的行为。

    编辑:我知道不推荐使用此解决方案(遵循 Django Docs),但这是您想要的行为。 Django-admin 只是向您显示数据库中的字符串,即''

    我想到的另一个解决方案是为您的 Package 模型修改 ModelAdmin,例如:

    class PackageAdmin(admin.ModelAdmin):
        readonly_fields = ['show_package_delivery_pattern', ...]
    
        def show_package_delivery_pattern(self, obj):
            if obj.package_delivery_pattern:
                return obj.package_delivery_pattern
            else:
                return 'N/A'
        # same with all your CharFields..
    

    【讨论】:

    • Docs say... " 除非您有充分的理由,否则避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,则意味着它有两个“无数据”的可能值:NULL 和空字符串。在大多数情况下,“无数据”有两个可能值是多余的; Django 约定是使用空字符串,而不是 NULL。” |见:docs.djangoproject.com/en/dev/ref/models/fields/#null |在我看来,前端管理员显示并不足以作为数据集规范化消息的充分理由。你的想法?
    • 是的...修改模型管理员是我的想法。感谢您根据我的评论更新您的答案。
    【解决方案2】:

    从 Django 1.9 开始,您可以在 Django 管理员的站点、模型或字段级别使用 empty_value_display。在模型级别:

    class YourModelAdmin(admin.ModelAdmin):
        empty_value_display = '---'
    

    【讨论】:

      猜你喜欢
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多