1. ホーム
  2. python

[解決済み] Django ログイン後、前のページにリダイレクトする

2022-04-16 01:44:19

質問

SOにあるようなログイン機能を持つシンプルなウェブサイトを構築しようとしています。 ユーザーは匿名ユーザーとしてサイトを閲覧することができ、各ページにログインリンクがあるはずです。ログインリンクをクリックすると、ユーザーはログインフォームに移動します。ログインに成功すると、ユーザーは最初にログインリンクをクリックしたページに戻るはずです。 ログインフォームを処理するビューに、現在のページのURLを何らかの方法で渡さなければならないと思いますが、うまくいきません。

EDIT 私はそれを考え出した。現在のページを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 }}">

そうそう、これで大体わかったかな。

どのように解決するのですか?

このために特別なビューを作る必要はなく、機能はすでに組み込まれています。

最も簡単な方法は、settings.pyにリクエストコンテキストプリプロセッサーを追加することです(最初の4つはデフォルトです)、するとリクエストオブジェクトはそれぞれのリクエストで利用できるようになります。

settings.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",
)

次に、ログインリンクを表示したいテンプレートに追加します。

base.htmlを作成します。

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

これは、現在のページを指し示すGET引数をログインページに追加するものです。

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

registration/login.html。

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