You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django BooleanField默认值不显示False显示'-'问题求助

Django Admin中BooleanField显示'-'的原因及解决办法

一、'-'代表什么?

你看到的'-'是Django Admin用来表示**空值(None)**的符号。核心原因是:你的Completed模型和User是一对一关联,但新建User时,Django不会自动创建对应的Completed实例——模型里的default=False是创建Completed对象时才会生效的规则,不是User创建时自动生成关联实例的逻辑。此时User没有对应的Completed记录,Admin展示该字段时就用'-'表示关联对象不存在。

另外先提下你代码里的明显问题:admin.py中定义的Inline类名叫Company,但关联的model是Completed,这极易混淆;而且can_delete: False是语法错误,要改成can_delete = False(用等号赋值,不是冒号)。


二、实现创建时显示False的几种方案

方案一:新建User时自动创建Completed实例(推荐)

用Django的post_save信号,让User创建完成后自动生成对应的Completed对象,这样Admin列表里会直接显示默认的False。

在models.py末尾添加信号代码:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_completed_for_user(sender, instance, created, **kwargs):
    if created:
        # 自动创建关联的Completed实例,使用默认的completed_application=False
        Completed.objects.create(user=instance)

方案二:自定义Admin列表显示,空值时返回False

如果不想自动创建Completed实例,只是想把列表里的'-'替换成False,可以修改UserAdmin里的completed展示方法:

在UserAdmin类中添加:

def completed(self, obj):
    # 尝试获取关联的Completed实例,没有则返回False
    return getattr(obj.completed, 'completed_application', False)
# 给列表列设置显示标题
completed.short_description = '是否完成申请'

方案三:修复Inline配置,新建User时直接生成Completed记录

先修正Inline的命名和语法错误,让新建User页面显示Completed的表单,保存时自动创建实例:

# admin.py中替换原Company Inline类
class CompletedInline(admin.StackedInline):
    model = Completed
    can_delete = False
    verbose_name_plural = 'Completed Application'

# 然后修改UserAdmin的inlines
class UserAdmin(UserAdmin):
    # ... 其他代码不变
    inlines = [CompletedInline]

这样在新建User的页面会显示Completed的勾选框,默认是未勾选(对应False),保存User时会自动创建Completed实例,之后列表里就会显示False了。

内容的提问来源于stack exchange,提问作者Olney1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:05:29