2013-04-17 120 views
1

我有一個ModelForm類,其中我設置了幾個字段爲ChoiceField。對於我的觀點之一,我想創建從我ModelForm類的形式,從我的模型的實例拉在數據庫中(像這樣):Django ModelForm ChoiceField不顯示實例數據

form = MyModel(instance=model_instance) 

當我做到這一點,然後渲染形式在模板中,我注意到大多數字段都預先填充了從模型實例中提取的值,這正是我想要的。但是,這不是兩個ChoiceField字段的情況。這些呈現爲下拉選擇菜單,沒有選擇特定的選項。

奇怪的是,如果我沒有在我的ModelForm類中將這兩個字段定義爲ChoiceField -type,它們將呈現爲HTML中的普通文本輸入字段,並使用數據庫值進行預填充。但是當我將它們定義爲使它們在HTML中顯示爲選擇選項輸入字段時,沒有任何內容是預選的。我可以改變它嗎,以便預先選擇數據庫中的值嗎?

編輯:如這裏要求是我的模型和形式的代碼:

class App(models.Model): 
    CODES = (
     (u'a',u'annual'), 
     (u'm',u'monthly'), 
     (u'w',u'weekly') 
    ) 
    code = models.CharField(max_length=1, choices=CODES) 
    start_time = models.TimeField(blank=True, null=True) 
    end_time = models.TimeField(blank=True, null=True) 


class AppForm(ModelForm): 
    CODES = (
     (u'',u'Please select code'), 
     (u'a',u'annual'), 
     (u'm',u'monthly'), 
     (u'w',u'weekly') 
    ) 
    TIMES = (
     (u'00:00',u'All Day'), 
     (u'12:00',u'Noon') 
    ) 
    start_time = forms.ChoiceField(required=False, choices=TIMES) 
    end_time = forms.ChoiceField(required=False, choices=TIMES) 
    code = forms.ChoiceField(choices=CODES, label='Type') 

    class Meta: 
     model = App 

有趣的是,code字段時爲HTML呈現預選就好模型實例值。我想知道模型定義中的choices參數是否有所不同?

更新:我只注意到,如果我拉了一個App例如在python manage.py shell像這樣:

a = App.objects.get(id=16) 
a.start_time 

我得到這樣datetime.time(12, 0)的值。但是在Django管理員中,當我查看所有App實例時,它們全都顯示(None)start_timeend_time之下。爲什麼會這樣?

+0

可能重複http://stackoverflow.com/questions/624265/how-do-i-make-a-django -modelform-menu-item-by-default)等等。 –

+0

您可以將代碼發佈到您的模型和表單中。謝謝。 – Amyth

+0

@Hedde,沒有看到默認選擇的選項。我希望所選的選項來自對象實例。您會注意到我實際上在其他問題的答案之下發布了一條評論,這正是因爲它對我無效。 – GChorn

回答

1

爲了響應您的更新:您的時間字符串匹配默認時間字符串HH:MM格式。就像用戶從網站手動輸入12:00一樣。這些值在模型保存時被解析並轉化爲時間(真正驗證時)。

當你加載模型 - 當然,從對象加載的初始值匹配字段的(models.TimeField)類型。

如果用

(datetime.time(0,0),u'All Day'), 
    (datetime.time(12,0),u'Noon') 

取代你倍的煩惱應該結束了。

艾倫

的[我如何使默認選擇一個Django的ModelForm菜單項?](
+0

嗨,艾倫,謝謝你的回答,我實際上在我看到你的回覆之前得出了同樣的結論(我實際上回到了「回答」我自己的問題!)。有趣的是,我在擺弄這個問題時發現的一件事是,如果在模型定義中使用時間的字符串表示形式創建了一組「CHOICES」,它會在嘗試將這些值中的一個保存到表單中時引發錯誤(如上所述,'CHOICES'在AppForm定義中提供時並不這樣做)。但最奇怪的是,它試圖保存''00:00''時,並沒有發生錯誤,只有'12:00'。 – GChorn

+0

如果您在表單中提供選擇,那麼您應該使用參數'coerce'設置爲datetime.time的forms.TypedChoiceField https://docs.djangoproject.com/en/dev/ref/forms/fields/#typedchoicefield。那應該可以解決這個錯誤。 –

相關問題