Djangoチュートリアルによると、cleaned_dataディクショナリを使用してフォームフィールドにアクセスする必要があります。フォームのプロパティに直接アクセスできないのはなぜですか?フォームは正常に検証されますが、アクセスしてみてください、Djangoオブジェクトに属性がないと文句を言います。問題の診断に役立つことを願って、以下にコードを追加しました。
形:
class CustomForm(forms.Form):
description = forms.CharField(widget = forms.TextInput(attrs = {'placeholder' : 'enter some text'}), label = "My form")
見る:
def process_form(request):
if request.method != 'POST':
raise Http404
myForm = CustomForm(request.POST)
if not myForm.is_valid():
c = RequestContext(request)
return render_to_response('home/index.html', {'form' : myForm }, c)
# debug
print 'Description: ' + myForm.description # this does NOT work
# print 'Description: ' + myForm.cleaned_data['description'] # this does work
次のエラーが発生します: 'CustomForm'オブジェクトに属性 'description'がありません。私はそれができないと言っているドキュメントの何かを見逃しましたか?
_Django.forms
_を使用してフィールドを定義する方法は、便利な宣言型構文です。これは、最終的なFormクラスまたはそのインスタンスが属性の観点からどのように見えるかを実際に表すものではありません。
フォームには metaclass があります(メタクラスは、深く掘り下げずに、class
キーワードを使用してクラスを宣言することです。___init__
_メソッドは、のインスタンスを作成することです。括弧を使用するクラス-作成されるオブジェクトをカスタマイズするためのフック。メタクラスの場合はclass
!)であり、定義時にフォームクラスからフィールドを選択して_base_fields
_ dict。フォームをインスタンス化すると、その_base_fields
_がインスタンスのfields
属性にディープコピーされます。
混乱の1つのポイントは、_.
_を使用してテンプレートに表示するフィールドにアクセスすることです。実際に起こっていることは、Djangoのテンプレートエンジンが最初に辞書スタイルの_[]
_アクセスを使用してプロパティルックアップを解決しようとすることです。基本フォームクラスは、これを利用するために ___getitem__
_ メソッドを定義し、フォームインスタンスのfields
dictから適切なフィールドを検索し、それをBoundField
、フィールドとフォームのデータを使用してフィールドを表示する方法を知っているラッパー。
フォームが検証されたら、アクセスできますmyForm clean_data:
print myForm.cleaned_data.get('description')
myForm.descriptionにアクセスできない理由を確認したい場合は、myFormのデータディクショナリを確認できます。
print myForm.__dict__
フォームインスタンスのフィールドには、そのフィールド属性からアクセスできます。
myForm.fields['description']
そして、labelのようないくつかのプロパティは次のようにアクセスできます:
myForm.fields['description'].label
対応する値の表示方法がわからない。誰かアイデアがありますか?
これが私の参考です
https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-the-fields-from-the-form
あなたはあなたのフィールドトロードにアクセスすることができますdict。
form.__dict__["fields"]["description"]