2012-02-15 57 views
5

私のWebページには、いくつかのAjaxリクエストの後にデータで埋められているフォームがあります。たとえば、ユーザーがリストからアイテムを選択すると、そのアイテムが選択された(ただしまだ確認されていない)単純なajaxリクエストがデータベースに送信されます。次に、Webページのリストは、新しい項目リストを取得するためにsimpe ajaxリクエスト(ページ全体ではなくリストのみ)を使用してリロードされます。django、フォームPOSTの後に前のページに戻る

これは多かれ少なかれ古典的なカートの実装だと思います。

しかし、リスト全体を確認するためにユーザーがサブミット(古典的なフォームPOST、実装に関する何らかの理由でajax POSTではなく)を押すと、私は現在のページに戻りたいと思います。 (現在のページが異なります)これは可能ですか?私はdjangoを使用しています。

ありがとうございました。

答えて

11

あなたはnext GETパラメータを供給することができ、同様のがのdjango.contrib.authするlogin()方法:

https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login

<form action="/url/to/post/form/?next={{ some_variable }}"> 

変数は単純に現在のURLを指定できます(とら要求から)または生成されたURL。フォームを処理するビューでは、単にnextパラメータを確認し、適切なリダイレクト:

from django.shortcuts import redirect 
if 'next' in request.GET: 
    return redirect(request.GET['next']) 
0

現在のページは非常に漠然としていますが、フォームページを参照したページが必要であると仮定しています。これは通常、リクエスト自体のHTTP_REFERRERヘッダーに格納されています。要求からフェッチしてリダイレクトを試みることができます。フォームを送信する際

+0

ありがとうございました。あなたは「いつもではない」と言いますが、それはなぜですか? – xpanta

+2

リファラーを送信するのはユーザーのブラウザです。一部のブラウザにはOperaを使用しない、またはOperaを使用しないようにするオプションがあります。もう一つの修正は、フォームに隠れた入力として現在のパスを含め、 'request.POST'でその値を調べることです。 – AdamKG

1

あなたはポスト/リダイレクト/ゲット・デザインパターン(PRG)を使用することができるかもしれません。 Post/Redirect/Getの一般的な情報については、以下を参照してください。http://en.wikipedia.org/wiki/Post/Redirect/Getそこには素晴らしいプロセスフロー図がいくつかあります。

次のようになります。PRGを実装するビューの一般的な例:あなたがGETともっと面白い何かをする必要がある場合は、reverseは引数とkwargsからを取ることができ

# urls.py 
urlpatterns = patterns('', 
    url(r'^/$', views.my_view, name='named_url'), 
) 

# forms.py 
class MyForm(forms.Form): 
    pass # the form 

# views.py 
def my_view(request, template_name='template.html'): 
    """ Example PostRedirectGet 
    This example uses a request context, but isn't 
    necessary for the PRG 
    """ 
    if request.POST: 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      try: 
       form.save() 
       # on success, the request is redirected as a GET 
       return HttpResponseRedirect(reverse('named_url')) 
      except: 
       pass # handling can go here 
    else: 
     form = MyForm() 

    return render_to_response(template_name, { 
     'form':form 
    }, context_instance=RequestContext(request)) 

。表示するparams、url_pattern、およびreverse callを操作して、表示したい結果を表示します。

もう1つ注意する点は、(この例のように)同じビューにリダイレクトする必要がないことです。これは、ユーザーをリダイレクトする名前の付いたビューです。

関連する問題