2009-08-26 106 views

回答

71

如果您想要設置默認初始值,您應該像其他表單域一樣定義initial,但您的set it to the id instead除外。

說你有field1這樣的:

class YourForm(forms.Form): 
    field1 = forms.ModelChoiceField(queryset = MyModel.objects.all()) 

,那麼你需要設置的初始當你創建形式是這樣的:

form = YourForm(initial = {'field1': instance_of_mymodel.pk }) 

而不是:

form = YourForm(initial = {'field1': instance_of_mymodel }) 

我還假設你已經爲你的模型定義了__unicode__,所以這個disp放置正確。

+0

不知道在寫這篇文章時的版本是什麼,但這個問題現在已經過時了。在寫作時,在Django 1.5中,這兩種方法都可以工作。 – JcKelley

+0

任何想法爲什麼我得到'__init __()有一個意外的關鍵字參數field1' – dashesy

14

你可以使用

field1 = forms.ModelChoiceField(queryset=..., initial=0) 

做出選擇等,這是更通用的方法,然後對方回答的第一個值。

+2

Django的這個版本是做什麼的?它在1.8版本中似乎不適用於我。 – BudgieInWA

+0

我已經從[源代碼](https://github.com/django/django/blob/1.8.11/django/forms/models.py#L1127-L1130)驗證過,並且自己測試一下,這個工作正常對於'django> = 1.8'。我相信這應該適用於所有版本,包括'> = 1.4' – Yeo

6

的時候,他們已經改變:通過定義initial像其他表單字段,除非你將其設置爲ID而不是

默認初始值現在可以設置。

現在這個就足夠了:

form = YourForm(initial = {'field1': instance_of_mymodel }) 

雖然雙方仍然有效。

+6

請指定您現在運行的Django版本是否「時代已更改」。改變了一些可能會升級到1.2 ... – scoopseven

-1

你可以這樣做,以及:如果你是通過解析查詢字符串或者通過Ajax調用沒有必要的情況下主鍵

form = YourForm(initial = {'field1': pk }) 

,查詢集已經處理,對於您的下降下來,PK索引狀態你想

1

代碼

form = YourForm(initial = {'field1': instance_of_mymodel.pk }) 

直接跟隨
form = YourForm(initial = {'field1': instance_of_mymodel }) 

或初始場:

field1 = forms.ModelChoiceField(queryset=..., initial=0) 

的所有工作。

前兩種方法將覆蓋最終的方式。