0

やあ、

投稿されたデータはリダイレクトで送信できないことをここで読んだだけですが、

そして、人々は一般的にリダイレクトの使用に満足していないことがわかりました。そして私の質問はなぜですか?


私の状況

登録済みまたは匿名の使用法を選択できるページをレンダリングすることから始まるDjangoアプリがあります。

def start(request):
    request.session.flush()
    return render_to_response('start.html')

登録済みの使用法を選択すると、登録データを挿入するための単純なフォームがレンダリングされ、フォームが有効になるまでループします。その後、「auth/」が実行されます。

def registration(request):
if request.method == "POST":
    form = RegistrationForm(request.POST)
    if form.is_valid():
        return HttpResponseRedirect('auth/')
    else:
        return render_to_response('registration.html',
                                 {'form':form})
form = RegistrationForm()
return render_to_response('registration.html',
                         {'form':form})

匿名の使用法が選択された場合、登録ページはスキップされ、「auth /」にリダイレクトされます。これは、上のコードと同じDjangoビュー関数です。

return HttpResponseRedirect('auth/')

authで達成したいと思っていたのは、セッションを設定し、データをデータベースに書き込んでから、登録ユーザーと匿名ユーザーと同じ次のページをリダイレクトすることです(セッションのみが異なります)。

def auth(request):
    ipdb.set_trace()
    if request.method == "POST":
        request.session['user_type'] = 'REG'
        request.session['email'] = request.POST['email']
        request.session['first_name'] = request.POST['first_name']
        RegisteredUser.objects.create(first_name = request.POST['first_name'],
                                      email = request.POST['email'],
                                      company = request.POST['company'])
    else:
        request.session['user_type'] = 'ANONIM'
    return HttpResponseRedirect('next_page')

もちろん、デバッガーが起動すると、request.methodは常にGETを返します。


私の理由

ビューをロジックから分離することについては多くの話がありますが、Djangoビュー関数を使用している場合(「auth /」を削除した場合、「next_page」はそれは機能性です)

  • request.postを確認してください

    • その理由が現在のページのフォーム検証である場合、または前のページからのものである場合は、そのデータをベースに書き込みます
  • 追加のチェックを実行して、登録済みまたは匿名ユーザーのセッションを設定します

レンダリングの代わりにリダイレクトするロジックのためだけに分離された関数を使用することは、一般的に受け入れられている方法ではないように思われるので、これを行う必要があります。

誰かが物事に光を当ててくれませんか?

ソリューションで更新

答えのおかげで、私はこれを行う方法のパターンを理解しました。登録のコードは次のとおりです。

def registration(request):
    if request.method == "POST":
        form = RegistrationForm(request.POST)
        if form.is_valid():
            request.session['user_type'] = 'REG'
            request.session['email'] = request.POST['email']
            request.session['first_name'] = request.POST['first_name']
            RegisteredUser.objects.create(first_name = request.POST['first_name'],
                                          email = request.POST['email'],
                                          company = request.POST['company'])

            return HttpResponseRedirect('param_select/')
        else:
            return render_to_response('registration.html',
                                     {'form':form},
                                     context_instance = RequestContext(request))
    form = RegistrationForm()
    return render_to_response('registration.html',
                             {'form':form},
                             context_instance = RequestContext(request))

これからは、「POSTデータを使って自分自身にループし、ロジックを実行する」方法を使用します。

名前をわかりやすく説明するために、それが新しい登録(リクエスト)が行うことです。

まず、データを入力するためのフォームをレンダリングします

それ自体へのリンクのためにデータが送信されるとリコールされるより

form action="" method="post"

これは、正しいフォームデータが送信されなくなるまで繰り返され、その後、ロジックが呼び出されます(この場合、ベースへの書き込みとセッションの設定)。

それは別のページへのhttpRedirectで終わり、登録はregistration(request)によって完全に処理されます。

4

1 に答える 1

2
  • デフォルトでは、ユーザーは匿名であり、ビューに設定されていると見なすことができrequest.session['user_type'] = 'ANONIM'ますstart()

  • で何をしていても、と一緒にauth()行うことができます。これにより、検証済みのフォームを使用して、必要に応じてエラーを作成し、フラグを立てることができます。registration()request.session['user_type'] = 'REG'RegisteredUser

  • そして、POST処理が有効で完了すると、にリダイレクトできますnext_page

  • 匿名ユーザーが選択された場合、ではなくstartにリダイレクトされますnext_pageauth/

于 2012-09-14T08:26:37.180 に答える