Django: ログイン後に前のページにリダイレクトする 質問する

Django: ログイン後に前のページにリダイレクトする 質問する

私は、SO にあるものと非常によく似たログイン機能を備えたシンプルな Web サイトを構築しようとしています。ユーザーは匿名ユーザーとしてサイトを閲覧でき、すべてのページにログイン リンクが表示されます。ログイン リンクをクリックすると、ユーザーはログイン フォームに移動します。ログインが成功すると、ユーザーは最初にログイン リンクをクリックしたページに戻ります。ログイン フォームを処理するビューに現在のページの URL を何らかの方法で渡す必要があると思いますが、うまくいきません。

編集: 解決しました。現在のページを GET パラメータとして渡してログイン フォームにリンクし、次に「next」を使用してそのページにリダイレクトしました。ありがとうございます!

編集 2: 私の説明が明確でなかったようですので、ご要望に応じて、ここに私のコードを示します。ページ foo.html にいるが、ログインしていないとします。ここで、foo.html に login.html にリンクするリンクを配置します。そこでログインすると、foo.html にリダイレクトされます。foo.html のリンクは次のようになります。

      <a href='/login/?next={{ request.path }}'>Login</a> 

ここで、次のようなカスタム ログイン ビューを作成しました。

def login_view(request):
   redirect_to = request.REQUEST.get('next', '')
   if request.method=='POST':
      #create login form...
      if valid login credentials have been entered:
         return HttpResponseRedirect(redirect_to)  
   #...
   return render_to_response('login.html', locals())

login.html の重要な行は次のとおりです。

<form method="post" action="./?next={{ redirect_to }}">

まあ、だいたいこんな感じです。これで分かりやすくなったと思います。

ベストアンサー1

このために追加のビューを作成する必要はありません。機能はすでに組み込まれています。

まず、ログイン リンクのある各ページで現在のパスを認識する必要があります。最も簡単な方法は、リクエスト コンテキスト プリプロセッサを settings.py に追加することです (最初の 4 つはデフォルトです)。その後、リクエスト オブジェクトが各リクエストで使用できるようになります。

設定.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
)

次に、ログイン リンクが必要なテンプレートを追加します。

ベース.html:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a>

これにより、現在のページを指す GET 引数がログイン ページに追加されます。

ログイン テンプレートは次のようにシンプルになります。

登録/ログイン.html:

{% block content %}
<form method="post" action="">
  {{form.as_p}}
<input type="submit" value="Login">
</form>
{% endblock %}

おすすめ記事