2016-05-14 59 views
1

在选择字段上设置空标签给我一些问题。我已经看过如this的答案,但这只是谈论表单。Django在选择字段中的空标签 - 没有查询集

假设我有以下型号:

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) 

这种形式:

class MyColorForm(forms.ModelForm): 
    class Meta: 
     model = MyColorModel 
     fields = ['mycolor'] 

默认情况下,这将显示一个选择字段,用空白标签设置----- -

我想出了以下选项来设置标签。

1)改变COLOR_CHOICES在我模型到:

COLOR_CHOICES = (
    ('', '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

2)改变COLOR_CHOICES在我模型到:

COLOR_CHOICES = (
    (None, '---Please select your color---'), 
    (BLUE, 'Blue'), 
    (RED, 'Red'), 
    (GREEN, 'Green'), 

3)下面INIT方法添加到我的型号表格

def __init__(*args, **kwargs): 
    super(MyColorForm, self).__init__(*args, **kwargs) 
    self.fields['my_color'].choices = [('', '---Please select your color---')] + MyColorModel.COLOR_CHOICES 

选项1导致一些副作用,其中if语句,我已经开始失败了,这就是促使我创建选项2

难道罚款添加空白标签,我的模型(选项2)?任何副作用,如果我添加它,或者它是更好的添加它的形式?当我在表单中设置空标签时,它似乎只是很多代码。

回答

1

在窗体上设置你想要的是一个更正确的方法来实现你想要的。在Django中,模型包含要存储的数据的基本字段和行为。也就是说,他们定义了您的信息在数据库中的结构。

1.我没有检查它,但你的第一个选项
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。如果基于字符串的字段的值为空= True,则表示它有两个可能的值:“无数据”:NULL和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的,Django约定是使用空字符串,而不是NULL。

3.你的第三个选项看起来不错。我有一段时间没有用django表单工作,但是如果你的代码有效,那么表单是一个更适合的地方来定义你的表单应该如何看起来像在你的模型中做的,所以去那个选项。

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

祝你好运!

+0

谢谢!你是正确的,我需要空白=真正在那里的选项1.我要选择2,但我一定会使用其中一个人现在 – Johan

1

所以你想为所有的模型表单设置empty_label,从你的?在选项中添加一个空白选项是很好的,甚至在docs中都有说明。

除非blank = False与默认值一起设置在字段上,那么包含“---------”的 标签将与选择框一起呈现。若要 重写此行为,请将元组添加到包含None的选项;例如 (None,'Your String For Display')。或者,您可以使用空的 字符串,而不是无此处有意义 - 例如在 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_labelform.field

def __init__(*args, **kwargs): 
    super(MyColorForm, self).__init__(*args, **kwargs) 
    self.fields['my_color'].empty_label = '---Please select your color---' 
+0

谢谢你的答案。我实际上也更喜欢设置空标签,因为您已经完成了最后一个选项,但似乎只有当模型字段是ForeignKey字段(即模型选项字段)时才起作用。对我来说,在正常的选择字段上设置空标签没有任何作用(使用Django 1.9) – Johan

+0

我在文档中阅读了这个内容,所以我将使用选项1:除非空白= False与默认字段一起设置,包含“---------”的标签将在选择框中呈现。要覆盖此行为,请将元组添加到包含None的选项;例如(无,'您的显示字符串')。或者,你可以使用空字符串而不是None,这是有道理的 - 比如在CharField上。 – Johan