2016-05-14 66 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