4

ユーザーからの入力を受け入れるビューがあり、投稿が成功すると、別のページにリダイレクトされます。チュートリアルのコードとほぼ同じです。

def quex(request, id, question_number):

    next_question = int(question_number) + 1
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/quex/' + id + '/' + str(next_question)) 
    else:
        form = QuestionForm() # An unbound form

    return render_to_response('questionnaire.html', {
        'form': form,
        'id' : id,
        'question_number' : question_number},
        RequestContext(request)

urls.py

urlpatterns = patterns('',    
    url(r'^$', 'django.contrib.auth.views.login'),
    url(r'^logout$', 'screening.views.logout_view'),
    url(r'^home/$', 'screening.views.home'),
    url(r'^quex/new/$', 'screening.views.new_quex'),
    # others omitted
    url(r'^quex/(?P<identifier>\w{8})/(?P<question_number>\d+)/', 'screening.views.quex'),
)

コードは機能しているようで、ページは正しく動作します。

私の問題は、クライアントに表示される URL が正しく更新されないことです。元のページはhttp://foo.com/questionnaire/ /1/ で、リダイレクトされたページは http://foo.com/questionnaire/ /2/ です。リダイレクト後も、古い URL がブラウザのアドレス バーに表示され続けます。

サーバーのステータス メッセージは正常に表示されます。

[19/Aug/2013 19:15:40] "GET /quex/P54C9UCS/1/ HTTP/1.1" 200 3225
[19/Aug/2013 19:15:44] "POST /quex/P54C9UCS/1/ HTTP/1.1" 302 0
[19/Aug/2013 19:15:44] "GET /quex/P54C9UCS/2/ HTTP/1.1" 200 3206

私は何を間違っていますか?ブラウザーに正しい URL を表示させるにはどうすればよいですか?

編集:もう少しテストを行いました。Chrome、Safari (OS X および iOS)、および Firefox では、上記のように URL が表示されます。しかし、iOS のブラウザ クメールhttp://foo.com/quex/<id>/1/#/quex/<id>/2/では URL が として表示されます。

4

5 に答える 5

1

テストはしませんでしたが:

urls.py

urlpatterns = patterns('',    
    url(r'^$', 'django.contrib.auth.views.login'),
    url(r'^logout$', 'screening.views.logout_view'),
    url(r'^home/$', 'screening.views.home'),
    url(r'^quex/new/$', 'screening.views.new_quex'),
    # others omitted
    url(r'^quex/(?P<identifier>\w{8})/(?P<question_number>\d+)/$', 'screening.views.quex', name='quex-view'),
)

ビュー.py

from django.core.urlresolvers import reverse_lazy


def quex(request, identifier, question_number):

    next_question = int(question_number) + 1
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass

            response_url = reverse_lazy('quex-view', kwargs={'identifier':identifier, 'question_number':next_question})
            return HttpResponseRedirect(reponse_url) 
    else:
        form = QuestionForm() # An unbound form

    return render_to_response('questionnaire.html', {
        'form': form,
        'identifier' : identifier,
        'question_number' : question_number},
        RequestContext(request)
于 2014-01-21T17:32:30.717 に答える
0

ビューメソッドを再帰として呼び出しているため、このエラーが発生しています。ここで return HttpResponseRedirect('/quex/' + id + '/' + str(next_question)) が再度同じメソッドを呼び出します。唯一の違いは request.method が POST から GET に変わることです。2 回目は get メソッドとして return render_to_response を呼び出し、ページが表示されます。私はあなたが私を通り抜けてくれることを願っています。

コードを次のように変更します。

def quex(request, id, question_number):
    next_question = int(question_number) + 1
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            # Next line I have written, so you will get same value of question_number as you get after returning from HttpResponseRedirect
            question_number =  next_question + 1 
    form = QuestionForm() # An unbound form

    return render_to_response('questionnaire.html', {
        'form': form,
        'id' : id,
        'question_number' : question_number},
        RequestContext(request)

このコードは、現在のコードとして機能します。バグなし。これがあなたに完全に役立つことを願っています。

于 2014-01-21T21:53:40.607 に答える
0
def quex(request, identifier, question_number):

    next_question = int(question_number) + 1
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/quex/' + identifier + '/' + str(next_question)) 
    else:
        form = QuestionForm() # An unbound form

    return render_to_response('questionnaire.html', {
        'form': form,
        'id' : identifier,
        'question_number' : question_number})
  1. あなたrender_to_response()は末尾がありません)
  2. の 3 番目の引数render_to_response()はオプションです。私は通常それをオフにします。ただし、ドキュメントに従って名前付き引数として渡します。ここにリンクの説明を入力
  3. 最後に: URL パターンに一致するdef quex(request, id, question_number):ようにする必要があります。def quex(request, identifier, question_number):また、quex の本体の id 参照を識別子に変更します (これはサンプル コードに含まれています)。
于 2014-01-24T19:52:12.127 に答える
0

ブラウザーが URL バーに表示する内容は、クライアント側のコードによって異なります。

  • シンプルな HTML フォームは正しくリダイレ​​クトされます。
  • jquery の$.ajax()呼び出しはデフォルトではリダイレクトされないため、コードが機能してもクライアントはリダイレクトされません。
于 2014-01-23T06:59:56.640 に答える
0

最後の quex 正規表現は、/$ ではなく / で終わります。最初にそれを変更します。単一の正規表現の変更が機能するように、ビューで逆に切り替えたと言います。

于 2014-01-18T18:19:25.853 に答える