python “empty_value_display”不适用于Django Admin中“更改列表”页面上的空字符串

mtb9vblg  于 2023-06-20  发布在  Python
关注(0)|答案(2)|浏览(121)

我定义了name字段,它在Person模型中接受一个空字符串,如下所示。* 我使用Django 4.2.1

# "models.py"

class Person(models.Model):
    name = models.CharField(max_length=20, blank=True)

    def __str__(self):
        return self.name

然后,我将"-empty-"设置为AdminSite.empty_value_display、ModelAdmin.empty_value_display、@admin.display()的empty_value或view_name.empty_value_display,如下所示:

# "admin.py"

admin.site.empty_value_display = "-empty-" # Or

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_display = ("view_name",)
    empty_value_display = "-empty-" # Or

    @admin.display(empty_value="-empty-") # Or
    def view_name(self, obj):
        return obj.name

    view_name.empty_value_display = '-empty-' # Or

但是,-empty-没有显示,即使我保存了一个空字符串,如下所示:

那么,当我保存一个空字符串时,如何显示-empty-呢?

jhkqcmku

jhkqcmku1#

正如您所发现的,这只适用于None,而不是空字符串。实际上,Django通过[GitHub]检查了这一点:

def display_for_value(value, empty_value_display, boolean=False):
    from django.contrib.admin.templatetags.admin_list import _boolean_icon

    if boolean:
        return _boolean_icon(value)
    elif value is None:
        return empty_value_display
    # …

因此,这不适用于任何具有真实性False的东西,例如空字符串,空列表,False等。将 * 不 * 呈现空值。
但是,这并不意味着你不能在必要时将空字符串折叠为None

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_display = ('view_name',)

    @admin.display(empty_value='-empty-', ordering='name')
    def view_name(self, obj):
        return obj.name or None

这将为具有真实性False的任何值(包括空字符串)返回None,并且因此将用-empty-呈现。

j13ufse2

j13ufse22#

AdminSite.empty_value_display,ModelAdmin.empty_value_display,@admin.display()的empty_value或下面的view_name.empty_value_display适用于None(Null)值,但不适用于空字符串:

# "admin.py"

admin.site.empty_value_display = "-empty-" # Or

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_display = ("view_name",)
    empty_value_display = "-empty-" # Or

    @admin.display(empty_value="-empty-") # Or
    def view_name(self, obj):
        return obj.name

    view_name.empty_value_display = '-empty-' # Or

因此,您需要定义name字段,该字段接受Person模型中的None(Null)值,如下所示。* 您应该将self.name替换为str(self.name),如下所示,否则在Django Admin中保存None(Null)值时会出现错误:

# "models.py"

class Person(models.Model):                            # Here
    name = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return str(self.name) # Here

然后,当您保存None(Null)值时,将显示-empty-,如下所示:

相关问题