在选择字段上设置空标签给我一些问题。我看过像this这样的答案,但这只是谈论表格。
假设我有以下型号:
if
这种形式:
class MyColorModel(models.Model):
BLUE = 'blue'
RED = 'red'
GREEN = 'green'
COLOR_CHOICES = (
(BLUE, 'Blue'),
(RED, 'Red'),
(GREEN, 'Green'))
my_color = models.CharField(max_length=5, choices=COLOR_CHOICES, blank=True)
默认情况下,这将显示一个选项字段,空白标签设置为------
我想出了以下选项来设置标签。
1)将模型中的COLOR_CHOICES更改为:
class MyColorForm(forms.ModelForm):
class Meta:
model = MyColorModel
fields = ['mycolor']
2)将模型中的COLOR_CHOICES更改为:
COLOR_CHOICES = (
('', '---Please select your color---'),
(BLUE, 'Blue'),
(RED, 'Red'),
(GREEN, 'Green'),
3)将以下 init 方法添加到我的模型表单:
COLOR_CHOICES = (
(None, '---Please select your color---'),
(BLUE, 'Blue'),
(RED, 'Red'),
(GREEN, 'Green'),
选项1导致了一些副作用,其中if语句我开始失败,这就是导致我创建选项2的原因。
将空白标签添加到我的模型(选项2)可以吗?如果我在那里添加任何副作用,或者将其添加到表单上更好?在表单中设置空标签时,似乎只有很多代码。
答案 0 :(得分:2)
所以你想为你的所有模型表单设置empty_label
吗?在选择中添加一个空选项很好,它甚至在docs中说明。
除非在字段上设置为空白= False,否则为默认值 标签包含" ---------"将使用选择框呈现。至 覆盖此行为,向包含None的选项添加元组;例如 (无,'您的显示字符串')。或者,您可以使用空的 这是有意义的字符串而不是无 - 例如在a上 CharField。
但是为了停止显示默认值,您需要设置blank=False
。所以尝试这样的事情:
class MyColorModel(models.Model):
BLUE = 'blue'
RED = 'red'
GREEN = 'green'
COLOR_CHOICES = (
('', '---Please select your color---')
(BLUE, 'Blue'),
(RED, 'Red'),
(GREEN, 'Green'))
my_color = models.CharField(max_length=5, choices=COLOR_CHOICES, blank=False, null=False, default='')
但在我看来,最好的方法就是在empty_label
上设置form.field
。
def __init__(*args, **kwargs):
super(MyColorForm, self).__init__(*args, **kwargs)
self.fields['my_color'].empty_label = '---Please select your color---'
答案 1 :(得分:1)
在表单上设置您想要的内容是一种更正确的方法来实现您想要的。在Django中,模型包含您存储的数据的基本字段和行为。也就是说,它们定义了您的信息在数据库中的结构。
我没有检查,但是你的第一个选择COLOR_CHOICES = (
('', '---Please select your color---'),
(BLUE, 'Blue'),
(RED, 'Red'),
(GREEN, 'Green'),
my_color = models.CharField(max_length=5, choices=COLOR_CHOICES)
可能不起作用,因为您的第一个选择是空字符串,但您的my_color
字段不包含blank=True
参数。这意味着它不允许将空字符串保存到数据库。但是如果你想要这个字段是强制性的,那么你的空选择的定义不应该在这里,因为它没有带来任何附加值,因为它没有任何关于你的数据结构的附加信息。
你的第三个选择看起来不错。我没有使用django表单工作一段时间,但是如果你的代码有效,那么Form更适合定义你的表单在你的模型中的表现,所以选择那个选项。避免在基于字符串的字段(如CharField和TextField)上使用 null ,因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。
或者查看帖子中链接的SO问题的解决方案并实施这些解决方案。
祝你好运!