リファラーページへのリダイレクトを除き、正常に機能するログインページがあります。ユーザーはアプリ内の直接リンクが記載された電子メールを受け取ります。この例では、ユーザーはまだログインしておらず、ログインページにリダイレクトされます。ログインに成功すると、ユーザーはハードコードされたパスにリダイレクトされます。以下の例を参照してください。
メールのURL:http://localhost:8000/issueapp/1628/view/22
ログインページのURL:http://localhost:8000/login?next=/issueapp/1628/view/22
ログインビュー(ハードコードされたリダイレクトを使用):
def login_user(request):
state = "Please log in below..."
username = password = ''
if request.POST:
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
state = "You're successfully logged in!"
return HttpResponseRedirect('/issueapp/1628/')
else:
state = "Your account is not active, please contact the site admin."
else:
state = "Your username and/or password were incorrect."
return render_to_response(
'account_login.html',
{
'state':state,
'username': username
},
context_instance=RequestContext(request)
)
ログインビュー(「次の」リダイレクトを使用):
def login_user(request):
state = "Please log in below..."
username = password = ''
if request.POST:
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
state = "You're successfully logged in!"
return HttpResponseRedirect(request.GET['next'])
else:
state = "Your account is not active, please contact the site admin."
else:
state = "Your username and/or password were incorrect."
return render_to_response(
'account_login.html',
{
'state':state,
'username': username
},
context_instance=RequestContext(request)
)
上記のビューの結果は例外"Key 'next' not found in <QueryDict: {}>"
になります。フォームは、URLとフォームにあるにもかかわらず、「次の」変数をポストしていないようです。私はどこでも検索して調べましたが、なぜ機能しないのかわかりません。何か案は?
追加の参照:
ログインテンプレート:
{% block content %}
{{ state }}
<form action="/login/" method="post" >
{% csrf_token %}
{% if next %}
<input type="hidden" name="next" value="{{ next }}" />
{% endif %}
username:
<input type="text" name="username" value="{{ username }}" /><br />
password:
<input type="password" name="password" value="" /><br />
<input type="submit" value="Log In"/>
{% debug %}
</form>
{% endblock %}
編集:以下は、私のために現在動作しているコードです(Paulo Buのおかげで)!**
ログインビュー:
def login_user(request):
state = "Please log in below..."
username = password = ''
next = ""
if request.GET:
next = request.GET['next']
if request.POST:
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
state = "You're successfully logged in!"
if next == "":
return HttpResponseRedirect('/issueapp/')
else:
return HttpResponseRedirect(next)
else:
state = "Your account is not active, please contact the site admin."
else:
state = "Your username and/or password were incorrect."
return render_to_response(
'account_login.html',
{
'state':state,
'username': username,
'next':next,
},
context_instance=RequestContext(request)
)
ログインテンプレート:
{{ state }}
{% if next %}
<form action="/login/?next={{next}}" method="post" >
{%else%}
<form action="/login/" method="post" >
{% endif %}
{% csrf_token %}
username:
<input type="text" name="username" value="{{ username }}" /><br />
password:
<input type="password" name="password" value="" /><br />
<input type="submit" value="Log In"/>
{% debug %}
</form>
コードは問題ありません。唯一の問題は、メソッドがnext
であるため、フォームでpost
属性を投稿として渡すことです。ビューでは、next
ディクショナリ内のget
パラメーターを取得しようとしますが、これは明らかではありません。
ビューを機能させるには、このようにhtmlフォームaction
を宣言する必要があります。
{% if next %}
<form action="/login/?next={{next}}" method="post" >
{%else%}
<form action="/login/" method="post" >
{% endif %}
{% csrf_token %}
username:
<input type="text" name="username" value="{{ username }}" /><br />
password:
<input type="password" name="password" value="" /><br />
<input type="submit" value="Log In"/>
{% debug %}
</form>
そこで、next
変数がある場合は、url
に含めて、getパラメーターとして取得します。そうでない場合、フォームには含まれません。
これが最良のアプローチですが、次のようにnext
辞書からPOST
を要求することで、ビューでこれを修正することもできます。
return HttpResponseRedirect(request.POST.get('next'))
これは、テンプレートaccount_login
hasnext
という変数。ビューで生成し、レンダリング時にテンプレートに渡す必要があります。
通常、テンプレートでは次のようにします。
# this would be hardcoded
next = '/issueapp/1628/view/22'
# you may add some logic to generate it as you need.
そして、あなたがします:
return render_to_response(
'account_login.html',
{
'state':state,
'username': username,
'next':next
},
context_instance=RequestContext(request)
)
お役に立てれば!
ビュー関数next_page = request.GET['next']
で定義し、return HttpResponseRedirect(next_page)
でリダイレクトするので、テンプレートを変更する必要はありません。 @login_required
を設定するだけで大丈夫です。
ユーザーAは、ログインしていないときにアクセスしようとします- https://www.domain.tld/account/ 。 Django settings.pyで@login_required
が定義済みLOGIN_URL
に設定されているため、彼をリダイレクトします。メソッドUserLogin
はGET
the next
パラメーターを試行しユーザーAが正常にログインした場合。
LOGIN_URL = '/login/'
url(r'^account/', account, name='account'),
url(r'^login/$', UserLogin, name='login'),
@login_required
def account(request):
return HttpResponseRedirect("https://www.domain.tld/example-redirect/")
def UserLogin(request):
next_page = request.GET['next']
if request.user.is_authenticated():
return HttpResponseRedirect(next_page)
else:
if request.method == 'POST':
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(email=username, password=password)
if user is not None and user.is_active:
login(request, user)
return HttpResponseRedirect(next_page)
else:
error_msg = 'There was an error!'
return render(request, "login", {'form': form, 'error_msg': error_msg})
else:
error_msg = "There was an error!"
return render(request, "login", {'form':form, 'error_msg':error_msg})
else:
form = UserLoginForm()
return render(request, "login", {'form': form})
より汎用的にしたい場合は、次のようなことを行うだけで済みます。フォームがポストされると、GETパラメーターのいずれかが渡されます。
<form action="/path-to-whatever/{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" method="post">
ビューでnext
を割り当ててテンプレートに渡す代わりに、テンプレートで?next={{request.path}}
を使用する方がクリーンではありません。 (Django.core.context_processors.request
でsettings.py
を有効にすることを忘れないでください。これは通常、Django 1.6)でデフォルトで有効になっています)
リンクについては同じことを伝えています
https://docs.djangoproject.com/en/1.6/topics/auth/default/#the-raw-way
<form action="/login/?next={{request.path}}" method="post" >
必要なコードです。
注:
view
からrequest.path
で現在のURLを取得することもできます。
buffer に感謝します。自分のコードで自分で試した後、コメントをコピーして貼り付けました。
置くだけ
<form action="" method="post" >
空のアクション 'what ever current complete url is
'