2012-05-04 30 views
1

フォームHTMLDjangoフォームエラー:有効な選択肢を選択してください。 29は、利用可能な選択肢

<form action="" method="post" class="form-horizontal"><div style="display:none"><input type="hidden" name="csrfmiddlewaretoken" value="6b3d58df7bd4f6d10975462aaf3bd42d"></div> 
     <input type="hidden" name="paper" value="5225" id="id_paper"><fieldset><div id="div_id_priority" class="control-group"> 
    <label class="control-label" for="id_priority">Priority</label> 
    <div class="controls"> 
     <select name="priority" id="id_priority"> 
<option value="1" selected="selected">Primary</option> 
<option value="2">Secondary</option> 
</select> 


     <p class="help-block"><span class="help_text">Primary - 1st Choice. Secondary - 2nd Choice.</span></p> 

    </div> 
</div> <!-- /clearfix --> 
<div id="div_id_topic" class="control-group"> 
    <label class="control-label" for="id_topic">Topics</label> 
    <div class="controls"> 
     <select name="topic" id="id_topic"> 
<option value="6">A</option> 
<option value="7" selected="selected">B</option> 
<option value="9">C</option> 
</select> 


    </div> 
</div> <!-- /clearfix --> 
<div id="div_id_subtopic" class="control-group error"> 
    <label class="control-label" for="id_subtopic">SubTopics</label> 
    <div class="controls"> 
     <select name="subtopic" id="id_subtopic"> 
<option value="29">KEEPER</option></select> 

     <span class="help-inline">Select a valid choice. 29 is not one of the available choices.</span> 


    </div> 
</div> <!-- /clearfix --> 
</fieldset> 

     <div class="form-actions"> 
      <button type="submit" class="btn btn-primary">Add</button> 
     </div> 

    </form> 

VIEW

@login_required 
@event_required 
def add_topic(request, paper_id): 
    event = request.event 
    paper = get_object_or_404(SubmissionImportData, pk=paper_id) 
    form = TopicForm(request.POST or None, event=event, paper=paper) 
    print request.POST # i see subtopic here 
    print form.errors 
    if request.method == 'POST' and form.is_valid(): 
     cd = form.cleaned_data 
     subtopic = request.POST.get('subtopic') 
     if subtopic: 
      subtopic_obj = get_object_or_404(SubTopic, pk=subtopic) 
     else: 
      subtopic_obj = None 

     paper_topic = PaperTopic.objects.get_or_create(
       submission_import_data=paper, 
       priority=cd['priority'], 
       topic=cd['topic'], 
       sub_topic=subtopic_obj)[0] 

     msg = 'Topic Successfully Added' 
     messages.success(request, msg) 
     url = reverse('submissions_nonadmin_view_topic', 
       args=[event.slug, paper.id]) 
     return redirect(url) 

Formクラス

class TopicForm(BootstrapForm): 
    topic = forms.ModelChoiceField(label='Topics', 
      queryset=None, required=False, empty_label=None) 
    subtopic = forms.ChoiceField(label='SubTopics', 
      widget=forms.Select(attrs={'disabled': 'disabled'}), 
      required=False) 
    paper = forms.IntegerField(widget=forms.HiddenInput()) 
    priority = forms.ChoiceField(label='Priority', 
      choices=PaperTopic.PRIORITY, required=False) 

    class Meta: 
     fields = (
       'priority', 'topic', 'subtopic', 'paper', 
       ) 
     layout = (
       Fieldset('', 'priority', 'topic', 'subtopic', 'paper',), 
       ) 

    def __init__(self, *args, **kwargs): 
     event = kwargs.pop('event') 
     #paper_topic = kwargs.pop('paper_topic') 
     paper = kwargs.pop('paper') 
     super(TopicForm, self).__init__(*args, **kwargs) 
     self.fields['paper'].initial = paper.id 
     self.fields['topic'].queryset = Topic.objects.\ 
       filter(setting=event.setting) 
     self.fields['priority'].help_text = 'Primary - 1st Choice. Secondary - 2nd Choice.' 
     #if paper_topic: 
      #self.fields['topic'].initial = Topic.objects.\ 
        #get(pk=paper_topic.topic.id) 

    def clean(self): 
     ''' 
     Limit topic associations to 2 
     ''' 
     print 111, self.cleaned_data # subtopic field is missing here 
     cleaned_data = self.cleaned_data 
     topic = cleaned_data.get('topic', None) 
     subtopic = cleaned_data.get('subtopic', None) 
     paper = cleaned_data.get('paper', None) 
     priority = cleaned_data.get('priority', None) 
     paper_obj = get_object_or_404(SubmissionImportData, pk=paper) 

     if topic: 
      topic_count = PaperTopic.objects.\ 
        filter(submission_import_data=paper_obj).count() 
      if topic_count >= 2: 
       raise forms.ValidationError("You can only select up to two sets of topic and subtopic associations.") 

     if PaperTopic.objects.filter(submission_import_data=paper_obj, 
       priority=priority).exists(): 
      raise forms.ValidationError("You have already chosen that priority level.") 
     if PaperTopic.objects.filter(submission_import_data=paper_obj, 
       topic=topic, sub_topic=subtopic).exists(): 
      raise forms.ValidationError("You have already chosen that set of Topic and Subtopic association.") 
     print 999999000000 
     return cleaned_data 

私は私を提出しようとしているのではありませんフォーム、私はこれを取得している電子rror: <span class="help-inline">Select a valid choice. 29 is not one of the available choices.</span>

トピックの選択した値に基づいて、AJAXを介してサブトピックドロップダウンリストのオプションを動的に生成しています。

私はrequest.POSTsubtopicを見ることができますが、cleanメソッドになると、subtopicフィールドが消えます。

私は何が起こっているのかあまりわからないんだけど...

UPDATE

もう一つのサブトピックのための値がないとき、select要素がdisabled=disabledに設定されています。このように私のフォームを提出しようとすると、私はsubtopicフィールドを私の清潔な方法で得ることができます。フィールドが無効になっていないとき、私はそれを私のきれいな方法で得ることができません。それは、私が期待しているのとは逆の振る舞いです。

答えて

12

ChoiceField()は、妥当性を検証するための選択リストが必要です。あなたはtopic

self.fields['topic'].queryset = Topic.objects.\ 
       filter(setting=event.setting) 

subtopicため これを行うが、これ何のオプションが有効ではないだろう、空のリストとして初期化されます。

可能なサブトピックインスタンスごとにself.fields['subtopic'].choicesを初期化し、どのトピックが選択されているかに応じて、どのサブトピックが表示/非表示になるかを決定する必要があります。

関連する問題