2

を受け取ってからPOST、新しいフィールドを含むフォームを生成し、前に受け取った値をPOST隠し変数として渡しようとしています。私はドキュメントで多くの検索を行ってきましたが、このフローの 2 つの側面を結び付けるものを見つけることができないようです。私はDjango 1.4とPython 2.7を使用しています。

ビュー.py

from django.shortcuts import render_to_response
from gateway_interface.forms import newForm

def requestNewForm(request):
    if (request.method == "POST"):
        form = newForm(request)

        return render_to_response('myTemplate.html', {'form' : form})

フォーム.py

from django import forms
class newForm(forms.Form):
    def __init__(self, request):
        my_passed_variable = request.POST['pass_variable']

    a_new_variable = forms.CharField(max_length = 25)

    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

myTemplate.html

<form action="/myNextDjangoView/" method="post">
    <div class="fieldWrapper">
        I need this value: {{ form.a_new_variable }} <br>
    </div>

    {% for hidden in form.hidden_fields %}
        {{ hidden }}
    {% endfor %}
<input type="submit" value="Submit">
</form>

何か根本的に間違ったことをしているに違いない。テンプレートで for ループを使用すると、表示可能なフィールドがページに表示されません。私が試したことはありませんが、隠しフィールドにデータが入力されませんでした。

助言がありますか?おそらく、どこかにインポートがありませんか?forms.pyを使用できるようにするためにインポートする必要があるものはありHiddenInput()ますか?

編集1:次のように変更forms.pyしました:

form django import forms
class newForm(forms.Form):
    a_new_variable = forms.CharField(max_length = 25)
    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        super(newForm, self).__init__(*args, **kwargs)

これは私の出力を変更していません。フィールドが表示されていない(非表示または表示)同じフォームが表示されます。私がする必要があるのは、初期化辞書を使用してインスタンス化することです。(私は思う?) ディクショナリには、すべての非表示フィールドの名前と値が含まれています。

initial_dict = { 'my_passed_variable' : request.POST.get('pass_variable') }
form = newForm(initial = initial_dict)

編集2:

初期化辞書を使用することは、正しい方向への一歩でした! フォームに表示されているフィールドが表示されるようになりましたが、非表示のフィールドにはまだ値が入力されていません。

ビュー.py

from django.shortcuts import render_to_response
from gateway_interface.forms import newForm

def requestNewForm(request):
    if (request.method == "POST"):
        initial_dict = { 'my_passed_variable' : request.POST.get('pass_variable') }
        form = newForm(initial = initial_dict)

        return render_to_response('myTemplate.html', {'form' : form})

編集3:

私はそれが働いている。私を正しい方向に導いてくれた Jordan Reiter に感謝します。問題はほぼ完全に、EDIT 1上記の後のブラウザのキャッシュであることがわかりました。Chrome のシークレット モードに移行すると、すべてが機能しました。

4

1 に答える 1

3

このコードには明確な問題があります:

from django import forms
class newForm(forms.Form):
    def __init__(self, request):
        my_passed_variable = request.POST['pass_variable']

    a_new_variable = forms.CharField(max_length = 25)

    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

まず、同じ名前の変数が 2 つあると非常に混乱します (ただし、1 つはself.my_passed_variableフォーム全体で使用でき、もう 1 つはフォームmy_passed_variableでのみ使用できます__init__)。どうにかして 2 つの変数を結び付けようとしていると思わざるを得ませんが、そうではありません。最悪/最良のシナリオ (のように書き直しmy_passed_variable = request.POST['pass_variable']た場合self.my_passed_variable = request.POST['pass_variable']) は、フォーム フィールド オブジェクトの値を文字列で上書きしています。

2 つ目は、関数から大量のコードを切り取ったと仮定してい__init__ます。super実際にこれをフォームにする がありません。現状では、フォーム オブジェクトは正しくインスタンス化されません。

あなたがやろうとしていると私が思うことをやろうとしているなら、次のように書き直してください:

from django import forms
class newForm(forms.Form):
    # first, I'm going to put the fields at the top, I think that's more standard
    a_new_variable = forms.CharField(max_length = 25)
    my_passed_variable = forms.CharField(widget = forms.HiddenInput())

    def __init__(self, request, *args, **kwargs):
        super(newForm, self).__init__(*args, **kwargs)
        self.fields['my_passed_variable'].initial = request.POST.get('pass_variable') # don't assume the variable is present!
于 2012-07-13T15:30:17.627 に答える