2012-04-19 77 views
0

values_list Django的表單驗證我有一個表格是這樣的:在ModelChoiceField

class SearchForm(forms.Form): 
    genus = forms.RegexField(
     regex=r'^[a-zA-Z]+$', 
     required=False, 
    ) 
    species = forms.RegexField(
     regex=r'^[a-zA-Z]+$', 
     required=False, 
    ) 
    island_group = forms.ModelChoiceField(
     required=False, 
     queryset=Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup'), 

現在,我的窗體上的island_group現場驗證失敗,因爲我不返回模型對象。我需要返回values_list以獲取不同的條目。這個表單還有一點,這就是爲什麼我不想使用模型表單。

我的問題是:什麼是讓我的表單驗證的最佳方式是什麼?

任何幫助非常感謝。

+0

'islandgroup'是另一個模型嗎?爲什麼不將該模型用於查詢集?如果你只需要過濾實際的信息,你可以添加一些帶'Locality'計數的'annotate',並對它們進行過濾。 – ilvar 2012-04-20 03:57:46

+0

表格實際上包含對應於幾種不同模型的字段。 iskandgroup是Locality模型中的一個字段。 – 2012-04-20 09:05:35

+0

對於不返回「模型」對象的查詢集,您無法執行'ModelChoiceField'。因此,將其設置爲'islandgroup'模型的查詢集或使其成爲一個簡單的'ChoiceField'並在'clean_island_group()上檢索一個對象' – ilvar 2012-04-20 16:37:58

回答

0

爲什麼不重寫save方法:在實際保存之前調用一些驗證函數?

0

我有同樣的問題,我現在的解決方案是使用ChoiceField而不是ModelChoiceField。我相信這是有道理的,因爲我們不希望用戶選擇模型實例,但是整個表格列中的不同屬性值和相同的屬性可能很好地對應於幾個模型實例。

class SearchForm(forms.Form): 
    # get the distinct attributes from one column 
    entries = Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup') 
    # change the entries to a valid format for choice field 
    locality_choices = [(e, e) for e in entries] 
    # the actual choice field 
    island_group = forms.ChoiceField(
     required=False, 
     choices=locality_choices) 

這樣Django的內置的驗證執行正是我們想要的,即檢查組從一列所有可能的屬性的成員是否被選中。