2016-06-01 10 views
2

私はPython2とDjango 1.9を使っています。Djangoフォーム: "有効な選択肢を選択してください。その選択肢は利用可能な選択肢の1つではありません。"

基本的に私は2つのドロップダウンを含むフォームを持っています。 2番目のドロップダウンは最初のドロップダウンの値に依存します。

例として、ドロップダウン#1に「カテゴリ」オプションが選択されている場合、ドロップダウン#2にはオプション「カテゴリA、カテゴリBおよびカテゴリC」が表示されます。同様に、ドロップダウン#1に "Department"オプションが選択されている場合、ドロップダウン#2には "Department1、Department2、Department3"と表示されます。

「部署」と「カテゴリ」の両方が、対応するデータベーステーブルを持つクラスであることに注意してください。

ここに私の質問が来る。そのフォームを定義する方法は?特に具体的には、第2のフォームでクラスCategoryのオブジェクトと時にはクラスDepartmentのオブジェクトが表示されることを示すにはどうすればよいですか?

これは私がこれまで持っているものです:私はdropdodown2を定義した方法

class MyClassForm(forms.Form):] 
    name = forms.CharField(max_length=255) 
    dropdown1 = forms.ModelChoiceField(
     queryset=TypeOfCriteria.objects.all().order_by('name')) 
    dropdown2 = forms.ModelChoiceField(
     queryset=Department.objects.none()) 

は予告:

dropdown2 = forms.ModelChoiceField(
     queryset=Department.objects.none()) 

私はdropdown2のパラメータquerysetの値を定義する必要がありますどのように?すべてのインスタンスのリストを取得するために照会するクラスを指定する必要があるので、どうすればよいですか?

今、私はdropdown2の内容をJQueryで読み込みます。しかし、私がポストデータを送信するために "送信"ボタンを押すと、私はいつもエラーが出ています: "有効な選択肢を選択してください。

答えて

4

1つのオプションは、フォームの__init__メソッドでクエリセットを動的に更新することです。であるとして、このコードを追加し、フォームクラスの残りの部分を保管してください:initメソッドで

def __init__(self, *args, **kwargs): 
    super(MyClassForm, self).__init__(*args, **kwargs) 
    if 'dropdown1' in self.data: 
     self.fields['dropdown2'].queryset = Department.objects.filter(typeofcriteria=self.data['dropdown1']) 
+0

は@raphvありがとう、私は「mymodelという」は放置すべきかわからないんだけど?私はそれの代わりに何を置くべきですか? – Xar

+1

@ Xarのように、 'Department.objects.filter(somefield = self.data ['selected_value'])'のようにstmする必要があります。 – Todor

2

def __init__(self, *arts, **kwargs): 
     super(MyClassForm, self).__init__(*args, **kwargs) 
     self.fields['dropdown2'].queryset = Department.objects.none() 
     if self.is_bound: 
     self.fields['dropdown2'].queryset = Department.objects.filter(# any value in self.data) 
関連する問題