web-dev-qa-db-ja.com

Djangoビューのプロパティとしてフォームフィールドにアクセスする

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'がありません。私はそれができないと言っているドキュメントの何かを見逃しましたか?

14
MK_Dev

_Django.forms_を使用してフィールドを定義する方法は、便利な宣言型構文です。これは、最終的なFormクラスまたはそのインスタンスが属性の観点からどのように見えるかを実際に表すものではありません。

フォームには metaclass があります(メタクラスは、深く掘り下げずに、classキーワードを使用してクラスを宣言することです。___init___メソッドは、のインスタンスを作成することです。括弧を使用するクラス-作成されるオブジェクトをカスタマイズするためのフック。メタクラスの場合はclass!)であり、定義時にフォームクラスからフィールドを選択して_base_fields_ dict。フォームをインスタンス化すると、その_base_fields_がインスタンスのfields属性にディープコピーされます。

混乱の1つのポイントは、_._を使用してテンプレートに表示するフィールドにアクセスすることです。実際に起こっていることは、Djangoのテンプレートエンジンが最初に辞書スタイルの_[]_アクセスを使用してプロパティルックアップを解決しようとすることです。基本フォームクラスは、これを利用するために ___getitem___ メソッドを定義し、フォームインスタンスのfields dictから適切なフィールドを検索し、それをBoundField、フィールドとフォームのデータを使用してフィールドを表示する方法を知っているラッパー。

16
Jonny Buchanan

フォームが検証されたら、アクセスできますmyForm clean_data:

print myForm.cleaned_data.get('description')

myForm.descriptionにアクセスできない理由を確認したい場合は、myFormのデータディクショナリを確認できます。

print myForm.__dict__
17
Zubair Afzal

フォームインスタンスのフィールドには、そのフィールド属性からアクセスできます。

myForm.fields['description']

そして、labelのようないくつかのプロパティは次のようにアクセスできます:

myForm.fields['description'].label

対応する値の表示方法がわからない。誰かアイデアがありますか?

これが私の参考です

https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-the-fields-from-the-form

5
Ajeeb.K.P

あなたはあなたのフィールドトロードにアクセスすることができますdict

form.__dict__["fields"]["description"]
3
Domagoj Kovač