0

Django1.4で次の奇妙な問題が発生しました。

#forms.py
from django import forms
class MyForm(forms.Form):
    my_choices = forms.ChoiceField()

# views.py
def my_view(request):
    vchoices = (('a', 'AAAA'),
               ('b', 'BBBB'),)

    form = MyForm()
# version1:
    form.my_choices=choices
# version2:
    form.my_choices.choices=vchoices

    context={'form': form}
    return render(request,index.html", {'form': form})

上記のコードを検討します。バージョン1を使用すると、出力が適切にレンダリングされますが、もちろん選択肢ボックスには選択肢がありません。version2を使用すると、次のエラーが発生します。

MyFormオブジェクトには属性'my_choices'がありません

どうしてそれができるの?バージョン1では、「my_choices」属性が存在するようですが、少なくともdjangoは文句を言いません。

2番目の質問は次のとおりです。forms.pyを次のように設定した場合

#forms.py
from django import forms
class MyForm(forms.Form):
    my_choices = forms.ChoiceField()
    my_choices.choices=(('a','aaaa'),('b','bbbb'))

フォームは正しくレンダリングされ、ドロップダウンボックスには選択肢が含まれています。

これを説明する方法、またはviews.pyでmy_choicesの属性の選択肢を設定する方法はありますか?

どうもありがとう

4

1 に答える 1

2

のようなフォームフィールドmy_choicesは、フォームインスタンスの属性にはなりません。form.fields代わりに、それらは辞書のメンバーになります。からアクセスできますform.fields['my_choices']

ただし、これを行う通常の方法は、フォームの__init__メソッドを使用することです。

class MyForm(forms.Form):
    my_choices = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        choices = kwargs.pop('choices')
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['my_choices'] = choices

を使用してフォームをインスタンス化しますform = MyForm(choices=my_choices)

于 2013-03-08T15:49:53.410 に答える