2

フォームを使用した Django でのコーディング。フォームが GET の場合、すべてのフィールドに常に「このフィールドは必須です」というエラーが表示されるという問題がありますが、フォームが POST の場合は問題ありません。簡単な例 (部分的なコード) を次に示します。

ビュー.py:

def login(request):        
    if request.method == 'GET':
        form = RegisterForm (request.GET)
    else:
        form = RegisterForm ()
return render_to_response('register.html', locals(), context_instance=RequestContext(request))

register.html:

<form action = "" method = "GET">
    <table style = "border: none;">
        <tr>
            <td class = "login"><strong>email:</strong></td>
            <td class = "login">{{ form.email }}</td>
            <td><span class = "error">{{ form.errors.email }}</span></td>
        </tr>

        ...
    </table>
</form>

すべての「GET」を「POST」に変更すると、すべて問題ありません。そうしないと、「form.errors.email」は常に「このフィールドは必須です」をスローします。エラー。

別の奇妙なこと... request.GET で開始されているフォーム オブジェクトが表示されないようです。Django Book 2.0 には、request.POST で開始されたフォーム オブジェクトのみが表示されます。私がここに欠けているものはありますか?

ヒントをありがとう。

編集: Craig と Ignacio からのヒントに感謝します。ただし、私の質問は、このフォームで何をしているのかに関係なく、GET または POST のいずれかで、フォームに GET があると常に「フィールドが必要です」というフォームエラーが発生するということです。それは私が理解していないメカニズムです。その上で何か助けていただければ幸いです、ありがとう。

4

3 に答える 3

2

私の間違いでなければ、デフォルトの HTTP リクエスト メソッドは、POST として指定されていない限り、常に GET です。したがって、(デフォルトで GET を使用して) そのビューにアクセスすると、if request.method == 'GET':ステートメントは既に満たされているため、空のデータをフィールドに挿入するための検証エラーが自動的に表示されます。あなたは実際にelse: form = RegisterForm()ライン に到達することはありません

非常に便利なツールバーであるdjango-debug-toolbarを確認してください。これにより、リクエスト タイプとリクエスト変数を確認できます。

于 2011-05-19T17:50:49.980 に答える
1

まず、ログインを使用している場合は、ユーザーのログイン時に常に post を使用する必要があります。

次に、ある場所で空のフォームを初期化していますが、他の領域では初期化していません。あなたが望む可能性が高いのは次のとおりです。

    def login(request):        
        if request.method == 'POST':
             form = RegisterForm (request.POST)
             # Some logic to validate the user
        else:
             form = RegisterForm ()
             return render_to_response('register.html', locals(), context_instance=RequestContext(request))

同じページに投稿する場合、アクション値は必要ありません。また、POST を使用している場合 (そうすべきです)、フォーム内で {% csrf_token %} を使用する必要があります。

于 2011-05-18T15:35:36.180 に答える
0

属性を省略しactionます。デフォルトでは、送信は同じURLに送信されます(もちろん、GETを使用しない場合)。

于 2011-05-18T15:13:37.603 に答える