如何在 Django 中为 None 时不显示字段

Posted

技术标签:

【中文标题】如何在 Django 中为 None 时不显示字段【英文标题】:How not to display a field when it's None in Django 【发布时间】:2021-05-02 08:04:19 【问题描述】:

我有这个模型:

class MsTune(models.Model):
    name = models.CharField(max_length=255) # title (source)
    start_page = models.CharField(max_length=20, blank=True, null=True, default=None)

def __str__(self):
        if not self.start_page or self.start_page != '' or self.start_page is not None or self.start_page is not "None" or self.start_page is not null:
            return '%s, %s' % (self.name, self.start_page)
        else:
            return '%s' % (self.name)

如您所见,如果start_page 为空,我只需要name,如果start_page 已填充,我只需要name, start_page。无论我设置了多少条件(见上文),我都会在模板中不断收到name, None。我错过了什么?另外,我可以使用更短的代码来代替冗长的if / else 吗?

编辑

这是我在数据库中字段的内容:

mysql> SELECT start_page from bassculture_mstune where id = 1942;
+------------+
| start_page |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

在 Django 的 shell 中:

>>> mytune = MsTune.objects.get(id=1942)
>>> print(mytune.start_page)
None

【问题讨论】:

***.com/questions/6584235/… 的第二个答案使用内置的 default_if_none 过滤器。 当使用肯定条件时你会得到什么? if self.start_page: return '%s, %s' % (self.name, self.start_page) else: return '%s' % (self.name) 其实显示视图和模板会更有启发性。 视图是一个简单的tunes = MsTune.objects.all(),模板只是% for tune in tunes % tune % endfor %。正条件向模板显示字符串“title, None”。 我认为 if 语句不是你想要的......“或”是错误的逻辑。它应该类似于 ... is not "None" 并且 ... is not "Null" ... 等等。 不,我仍然没有。此外,为什么是“和”?它永远不会把所有这些东西放在一起。 【参考方案1】:

由于默认值将是 "" 与您的字段一样,因此只需检查 not value 应该可以:

def __str__(self):
    returnVal = f"self.name"
    if self.start_page:
        returnVal = f"returnVal, self.start_page"
    return returnVal

或者,你可以使用三元运算:

def __str__(self):
    return self.start_page and f"self.name, self.start_page" or f"self.name" 

Python三元运算:Refs

【讨论】:

从我上面的代码可以看出,我已经有了if self.start_page is not None 条件。我的主要问题是None 仍然显示。 @HBMCS 编辑,看看。 这也是我尝试的第一件事。我已将它添加到 'ifs' 的 loooong 列表中。仍然没有运气。数据是如何写入 MySQL 数据库的?我已经从 .sql 转储中导入了它。还有什么其他类型的 null/None/'none'? @HBMCS 你可以试试:print(self.start_page) 并检查输出是什么。在模板和终端/

以上是关于如何在 Django 中为 None 时不显示字段的主要内容,如果未能解决你的问题,请参考以下文章

ManytoMany 字段中的 Django ForeignKey 显示为 None

如何在 Django 管理员中为模型字段使用自定义表单字段?

如何在字段集中显示Django管理员内联模型?

如何在Django中为表单字段添加自定义标题?

Django 内置字段

Django Form 内置字段