2013-04-12 10 views
3

我有一個表格從繼承的ModelForm這樣:的Django的ModelForm與選擇的Widget - 使用object.uid作爲默認選項值,而不是object.id

class ChildModel(ModelForm): 
     class Meta: 
      model = Documents 
      fields = ('secretdocs') 
      widgets = { 
       'secretdocs': Select(attrs={'class': 'select'}), 
      } 

模型「secretdocs」有一個UID。但是,當它打印出的選擇和選項,該選項值顯示爲這樣:

<select class="select" id="id_secretdocs" name="secretdocs"> 
    <option value="1">My Secret Doc</option> 
</select> 

但我想它,而不是有選擇的UID:

<select class="select" id="id_secretdocs" name="secretdocs"> 
    <option value="cd2feb4a-58cc-49e7-b46e-e2702c8558fd">My Secret Doc</option> 
</select> 

我到目前爲止已經試過使用BaseForm的數據對象並覆蓋Select的value_from_datadict方法,但我確信這不是正確的方法。有誰知道我該怎麼做?

在此先感謝。

回答

10

你可以做這樣的事情:

class ChildModel(ModelForm): 

    secretdocs = forms.ChoiceField(choices=[(doc.uid, doc.name) for doc in Document.objects.all()]) 
    class Meta: 
     model = Documents 
     fields = ('secretdocs',) 
     widgets = { 
      'secretdocs': Select(attrs={'class': 'select'}), 
     } 
+0

雖然這確實工作,在uids顯示,它似乎並不像我以前使用相同的查詢不能過濾我的查詢集。平心而論,我對Django來說很新,所以也許還有一些額外的東西需要添加? – limasxgoesto0

+0

是的 - 只需將'Document.objects.all()'替換爲您以前的過濾標準 – karthikr

+0

它需要由當前用戶過濾。我認爲這可以使用lambdas完成,對嗎?我現在沒有時間嘗試,但我會盡快研究它。 – limasxgoesto0

2

我認爲「正確」的方式做,這部分是爲了確保UUID字段設置爲模型的問題,主鍵沒有自動編號ID字段。

例如:

class Document(models.Model): 
    uuid = models.YourCustomUUIDField(primary_key=True,.....) 
    other_field = models.CharField(.....) 
    .... 

如果你這樣做了,我想Django會拿起UUID字段作爲主鍵和任何地方使用它。但是,如果您希望保留內置自動增量主鍵字段並僅在此處使用UUID,則可以執行類似於karthikr在需要UUID字段的那些表單中所建議的內容。

+0

相信我,我想這樣做,但我需要改變其他部分。 – limasxgoesto0