选择字段中的Django空标签 - 没有查询集

时间:2016-05-14 07:01:17

标签: django forms

在选择字段上设置空标签给我一些问题。我看过像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)可以吗?如果我在那里添加任何副作用,或者将其添加到表单上更好?在表单中设置空标签时,似乎只有很多代码。

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参数。这意味着它不允许将空字符串保存到数据库。但是如果你想要这个字段是强制性的,那么你的空选择的定义不应该在这里,因为它没有带来任何附加值,因为它没有任何关于你的数据结构的附加信息。

2.你的第二个选择绝对不是[1]
  

避免在基于字符串的字段(如CharField和TextField)上使用 null ,因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。

你的第三个选择看起来不错。我没有使用django表单工作一段时间,但是如果你的代码有效,那么Form更适合定义你的表单在你的模型中的表现,所以选择那个选项。

或者查看帖子中链接的SO问题的解决方案并实施这些解决方案。

祝你好运!