私は、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 %}