2009-07-15 25 views
2

Djangoフレームワークは、ユーザーが正しくログインに失敗したときに、リダイレクトを簡単に処理します。ただし、このリダイレクトは別のログインページに送られます。私はログインしたページと同じになるようにテンプレートを設定できますが、私の他のオブジェクトは新しいページに存在しません。ログイン失敗時に同じページにリダイレクトする方法

たとえば、ニュース記事を多数表示するフロントページがあります。サイドバーにはログインフォームがあります。ユーザーがログインしても認証に失敗した場合は、フロントページに戻って、表示されているすべてのニュース記事を保存します。現在のところ、ニュース記事は表示されません。

この問題を解決するにはどうすればよいですか?どんな助けもありがとうございます。

編集:表示されている動的コンテンツがあることを覚えていますが、私はまだ表示したいと思います!さらに、ユーザーがログインできる唯一の場所はメインページだけではありません。サイドバーは決して変更されないため、ユーザーはサイトの任意のページからログインでき、そのページのすべてのコンテンツは、ログイン失敗時に表示されます。

答えて

6

ログイン失敗時に参照ページにリダイレクトしますか?

... authentication code above 

if user.is_authenticated(): 
    #show success view 
else: 
    return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('index')) 

あなたは、そうでない場合(デフォルトのURLは、「インデックス」と命名されたと仮定して)URLをデフォルトに設定し、参照するページのURLが正しく設定されていることを確認したい場合があります。

+0

どのように私はこれを行うのでしょうか? – AlbertoPL

+0

@AlbertoPLエラーが発生しても表示がリダイレクトされない – Evgeny

+0

@AlbertoPL関数authenticate()があります - マニュアルを参照してください - 私は行っています:) – Evgeny

0

これは、ビューをリダイレクトすると、最初にページを表示するために使用した元のコンテキストが失われるためです。

単純なロジックがありません。同じテンプレートをもう一度レンダリングしようとしていますが、news_articleリストは表示されません。

最初に、あなたは記事とログインフォームを表示するテンプレートをレンダリングしています.1つはログインフォーム、2は記事リストです。 しかし、第二に、ユーザーが認証に失敗したときに、同じことをもう一度やり直すことはありません。これらの変数をコンテキストとして再度渡します(フォームがエラーメッセージを処理していない場合は、エラーメッセージを追加することもできます)。

if user.is_authenticated(): 
    #show success view 
else: 
    return render_to_response('same_template.html', { 
     'error_msg': 'Username or password you provided was incorrect', 
     'news_articles': NewsArticles.objects.all()[:3], 
     'login_form': LoginForm(request.POST); 
    }) 

編集:現実はコンテキストは、テンプレートをレンダリングするために使用される、ということであり、それはそれはさらに、ナビゲーションに渡したいものを、そのテンプレートの完全な責任です。そして、私が見ているように、あなたが何かをさらに渡していなければ、あなたはそれ以上のことを得ていません。

自動化されたコンテキストが必要な場合は、auth-context-processorのような独自のコンテキストプロセッサを開発します。これは自動的にテンプレートの「ユーザー」のように追加されます。

ログインが認証されていても、とにかくその種のコンテキストを逃してしまうでしょう。その特定のコンテキストが本当に重要な場合は、ログインフォームのサブミットと共に記事の主キーを送信するか、グローバルに保存するか(醜いこと)、フローを再考して分離してください(良いこと、私は感じます)。

+0

Djangoフォームを使用している場合、必要な処理を行うエラーメッセージを渡す必要はありません:) – aatifh

+0

私は必ずしもすべてのニュース記事を表示していません。たとえば、表示されたニュース記事の一部を除外した検索を行ったことがあります。以前と同じ数の記事を表示できるようにする必要があります。 – AlbertoPL

+0

さてさて、私はあなたが言ったことを調査し、私の調査結果を掲載します。 – AlbertoPL

0
  1. コールログインビューにサイドバーで<IFRAME>を使用してください - すべてのポストバック はインラインフレーム内で発生しますので、 ページはそのまま残ります。 ビジターが正常にログインすると、あなた は、ログインフォームを投稿するためにいくつかの他のURL
  2. 使用AJAXに 親ページをリダイレクトするためにJavaScriptを使用することができます - (1)が、 それは手段として は、同じ効果をacheivesあなた訪問者は にjavascript対応のブラウザを持っている必要があります

私は個人的に別のページにログインしたいと思っています。あなただけの訪問者が(うるさいクライアントに拘束されないと言う、)自分の現在のページを失うことを心配している場合は、lightboxでログインショーアップを持つことができます。私は過去のすべての3つのアプローチを使用しました、と私はあなたが興味を持っている場合、一部のコードサンプルを投稿させていただきます。私はdjango.contrib.auth.views.login使用している場合

関連する問題