2017-10-25 16 views
1

私はこの質問が既にStackoverflowで何十回も尋ねられてきたことは知っていますが、私はそれらのすべてを通して経験しています。通常、それらの大部分は、モデルフィールドが整数の場合は文字である選択肢に、その逆の場合は選択肢に関連します。しかし、これは私の状況です有効な選択肢を選択してください。 xは利用可能な選択肢の1つではありません

私は、Djangoのヘルプデスク、ここで見つけることができるオープンソースのジャンゴベースの発券プラットフォームに取り組んでいます:https://github.com/django-helpdesk/django-helpdesk

そして私は公共のチケットのための彼らのforms.pyにいくつかの変更を行いました私が最近新しいキューを追加するまで、これはすべてこの間に働いていました。

Forms.py

class PublicTicketForm(CustomFieldMixin, forms.Form): 

    queue = forms.ChoiceField(
     widget=forms.Select(attrs={'class': 'form-control'}), 
     label=_('Queue'), 
     required=True, 
     choices=() 
    ) 

だから、その

form = PublicTicketForm(initial=initial_data) 
     form.fields['queue'].choices = [(q.id, q.title) for q in Queue.objects.filter(allow_public_submission=True)] + \ 
             [('', 'Other')] #I'm thinking this line may be the problem here 


    return render(request, 'helpdesk/public_homepage.html', { 
     'form': form, 
     'helpdesk_settings': helpdesk_settings, 
    }) 

呼び出されたときに、この形式は、選択肢がビューに読み込まれます。ここ何form.fields['queue'].choices版画です:

[(6Lは、 (8L、u'Request ')、(u'Account')、(7L、u'Support ')、(4L、u'Orders')、(5L、 u'Products ' 'その他')]

したがって、キューを選択して送信すると、フォームは送信されず、このエラーが表示されます。

"Not one of the available choices" 

私の知る限り、選択肢はすべて整数であり、文字ではありません。私はここで何が欠けていますか?すべての助けが大いに評価されるでしょう!

+0

なぜIDが '6L'、' 7L'などと印刷されていますか? 'L 'はどういう意味ですか? 'Queue.id'はどんなタイプですか? –

+0

Lは長整数型を意味すると思います。 'type(q.id)'を実行すると、 'Long'と表示されます – DeA

+0

Python 2を使用する特別な理由はありますか? FWIWは、Python 3では、 'int'と' long'が改良された 'int'型に統一されました。 –

答えて

0

私の推測では、GETリクエストの選択肢を設定していますが、フォームデータが検証されたときのPOSTリクエストではありません。選択肢を設定するコードをフォームの__init__メソッドに移動することで、この問題を回避できます。自体。

class PublicTicketForm(CustomFieldMixin, forms.Form): 

    queue = forms.ChoiceField(
     widget=forms.Select(attrs={'class': 'form-control'}), 
     label=_('Queue'), 
     required=True, 
     choices=() 
    ) 

    def __init__(self, *args, **kwargs): 
     super(PublicTicketForm, self).__init__(*args, **kwargs) 
     self.fields['queue'].choices = [(q.id, q.title) for q in Queue.objects.filter(allow_public_submission=True)] + [('', 'Other')] 

ModelChoiceFieldを使用する方が簡単かもしれないことに注意してください。

class PublicTicketForm(CustomFieldMixin, forms.Form): 
    queue = forms.ModelChoiceField(queryset=Queue.objects.filter(...)) 
関連する問題