2017-02-23 12 views
0

私はDjangoテンプレートで動的フォームを作成しようとしています。私のDjangoフォームで選択できないエラーが表示されるのはなぜですか?

2つのドロップダウン選択肢があります。ユーザーが最初のオプションを選択すると、2番目のドロップダウンで使用可能な選択肢が動的に変化します。 2番目のドロップダウン要素の選択肢を変更するために使用するjQueryコードを次に示します。

$(document).on("change", "[id^=id_form][id$=brand]", function() { 
    var $value = $(this).val(); 

    var $id_prefix = $(this).attr('id').slice(0, -5); 
    $auto_type = $("#" + $id_prefix + "auto_type"); 

    $.ajax({ 
     type: 'GET', 
     url: '/europarts/filter/auto/type/with/brand/' + String($value), 

     success: function(data) { 
      $auto_type.html(data); 
     } 
    }); 
}); 

リンクからいくつかのHTMLを取得することができます。これは、基本的に現在のものを置き換える一連のオプションです。ここでは、コードは次のとおりです。ここで

{% for auto_type in auto_types %} 
    <option value="{{ auto_type.id }}">{{ auto_type.name }}</option> 
{% endfor %} 

は私の形である:

class ListForm(forms.ModelForm): 

    class Meta: 
     model = List 
     fields = ['ref_no'] 


class ProductCreateForm(forms.Form): 
    brand = forms.ModelChoiceField(queryset=Brand.objects.all(), initial=Brand.objects.first()) 
    auto_type = forms.ModelChoiceField(queryset=AutoType.objects.filter(brand=Brand.objects.first()), empty_label=None) 
    part_no = forms.CharField(max_length=50) 
    description = forms.CharField(max_length=255) 
    quantity = forms.IntegerField() 
    unit = forms.CharField(max_length=20, initial='piece(s)') 
    cost_price = forms.IntegerField(required=False) 
    selling_price = forms.IntegerField(required=False) 

私はリストで複数の製品を保存するために、動的フォームセットのjQueryライブラリを使用しています。

これまではうまくいきました!

Select a valid choice. That choice is not one of the available choices. 
:私はこのようなオプションを変更し、フォームを送信しようとした後ただし、フォームのページは言う2番目のドロップダウンのデフォルトのオプションとエラーと一緒にいない変更のものと再びロードされる

フォームが送信されるときの値はrequest.POSTです。

<QueryDict: {'form-MAX_NUM_FORMS': ['1000'], 'form-1-description': ['lskdjf'], 'form-1-auto_type': ['3'], 'form-MIN_NUM_FORMS': ['0'], 'form-0-quantity': ['1'], 'form-0-brand': ['2'], 'form-0-part_no': ['293847'], 'form-0-auto_type': ['2'], 'form-0-unit': ['piece(s)'], 'form-0-description': ['slkdfj'], 'form-1-part_no': ['928374'], 'form-TOTAL_FORMS': ['2'], 'form-1-quantity': ['1'], 'form-INITIAL_FORMS': ['0'], 'ref_no': ['REF230498203948'], 'csrfmiddlewaretoken': ['WYN08Hi2YhwTSKPS8EnLaz94aOz33RVfFMjwYeHr3rMxBImxn7ggSLYHwguIbuL0'], 'form-1-brand': ['2'], 'form-1-unit': ['pieces']}> 

あなたはもともと'form-1-auto_type': ['1']'form-1-auto_type': ['3']を見ることができます。フォームは元の値があるときに送信されますが、動的な値の変更後には上記のエラーが表示されます。

このエラーは2回目のドロップダウン時に表示されます。これをどうすれば解決できますか?フォームが、それはオプションでは、このような場合には、フィールドの選択肢に存在するかどうかをチェックし、検証されている

+0

選択または送信時に2番目のオプションを入力しますか – Cadmus

+0

フォームのコードを表示できますか? – albar

+0

@SnakeFcz On選択します。私の質問は明らかではないかもしれない。私は2番目のドロップダウンのオプションを動的に変更することができました。しかし、私はフォームを提出することはできません、私はそれを動的に変更するとエラーが表示されます。 – MiniGunnR

答えて

1

:あなたが最初のブランドからオプションを選択したときに

queryset=AutoType.objects.filter(brand=Brand.objects.first()) 

これはのみ動作します。 auto_typeフィールドの選択肢を更新してからデータを検証する必要がある場合や、auto_typeの選択肢をどのブランドにも制限しないようにしてから、ページが読み込まれるときにJavaScriptのselect要素を更新する方が簡単かもしれません最初のブランドのオプション。

+0

私はロード時のオプションを更新するためにjavascriptの方法を試してみたいと思います。それが動作する場合、回答として受け入れます。 2分くらい – MiniGunnR

+0

私はDjango Dynamic Formsを使用して複数のフォームを作成しています。だから、私はjavascriptを使うのは難しいと思う。 Djangoでクエリーセットを更新するにはどうすればよいですか?最初のドロップダウンに変更がある場合は、URLにリクエストを送信しています。フォームフィールドのクエリーセットを変更するために、そのビューにいくつかのコードを置くことはできますか? – MiniGunnR

+0

気にしないでください。私はそれを働かせました。私はjavascriptコードを使用しました: '$(document).ready(function(){ \t \t \t $("#id_form-0-auto_type ")html( ''); \t \t});「感謝の男。 – MiniGunnR