2016-01-01 52 views
0

「選擇一個有效的選擇」的錯誤這是我簡單的形式與一個ModelChoiceFieldModelChoiceField給出提交

class PropertyFilter(forms.Form): 
    type = forms.ModelChoiceField(queryset=Property.objects.order_by().values_list('type', flat=True).distinct(), 
            empty_label=None) 

它允許用戶從其中的一個選項(每個表示爲一個字符串)進行選擇。當我選擇一個選項,並點擊「提交」 - 它返回:

Select a valid choice. That choice is not one of the available choices.

views.py看起來是這樣的:

from models import Property 
from .forms import PropertyFilter 

def index(request): 
    if request.method == 'POST': 
     form = PropertyFilter(request.POST) 
     if form.is_valid(): 
      return HttpResponseRedirect('/') 
    else: 
     form = PropertyFilter() 
     properties = Property.objects.all() 
    return render(request, 'index.html', context=locals()) 

我到底做錯了什麼?

回答

2

ModelChoiceField的查詢集參數不能爲values_list,因爲它將保存關係,所以django必須使用完整的模型對象,而不是模型對象的某些值。

如果你想顯示自定義選擇文本,你應該自己定義一個簡單的選擇字段,以django的方式。你也可以繼承Django的形式ModelChoiceField並覆蓋label_from_instance方法來返回你想要的文字顯示:

class PropertyModelChoiceField(forms.ModelChoiceField): 
    def label_from_instance(self, obj): 
     return obj.type 

class PropertyFilter(forms.Form): 
    type = PropertyModelChoiceField(queryset=Property.objects.all()) 

東西沒有關係的,但最好使用PropertyFilterForm爲形式的名稱,它會使你的代碼更清晰閱讀。另外type是python中的保留字,所以請嘗試使用其他字段名稱,如property_type會更好。

編輯:

我覺得你(和我一樣)都搞不清楚什麼是你的初衷。你需要選擇從選擇的Propertytypes,不Property對象,所以你需要使用ChoiceField代替:

class PropertyFilter(forms.Form): 
    type_choices = [(i['type'], i['type']) for i in Property.objects.values('type').distinct()] 
    type = forms.ChoiceField(choices=type_choices) 
+0

感謝您的回答!你能解釋一下你提供的代碼如何適合我已有的代碼? – Dennis

+0

對不起,我不明白,但我已經提供了整個事情。你首先繼承django的默認'forms.ModelChoieField'來創建一個自定義字段,然後你的表單'PropertyFilter'使用我們創建的新字段。 –

+0

我開始明白了:)有什麼辦法可以選擇不同的類型值嗎? – Dennis