@login_required 后的 Django 重定向到下一个 [英] Django after @login_required redirect to next
问题描述
我觉得这是一个简单的问题,我只是错过了一小步.
I feel like this is an easy question and I'm just missing 1 small step.
我想执行以下任意数量的操作(作为下一个参数中的术语):
I want to do any number of the following (as the term in the next parameter):
[not signed in] -> profile -> login?next=/accounts/profile/ -> auth -> profile.
[not signed in] -> newsfeed -> login?next=/newsfeed/` -> auth -> newsfeed.
而我目前要去:
[not signed in] -> profile -> login?next=/accounts/profile/ -> auth -> loggedin
[not signed in] -> newsfeed -> login?next=/newsfeed/ -> auth -> loggedin
我希望以某种方式将 next
参数从 login
上的表单传递到 auth
并具有 auth
重定向到这个参数
I am looking to somehow pass the next
parameter from a form on login
to auth
and have auth
redirect to this parameter
目前我正在我的 login.html
中尝试:
Currently I am trying in my login.html
:
<input type='text' name="next" value="{{ next }}">
然而,这并没有得到下一个值.从调试工具栏可以看到:
however this is not getting the next value. I can see from the debug tool bar:
GET data
Variable Value
u'next' [u'/accounts/profile/']
视图
:
def auth_view(request):
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
print request.POST
return HttpResponseRedirect(request.POST.get('next'),'/accounts/loggedin')
else:
return HttpResponseRedirect('/accounts/invalid')
login.html
:
{% extends "base.html" %}
{% block content %}
{% if form.errors %}
<p class="error"> Sorry, you have entered an incorrect username or password</p>
{% endif %}
<form action="/accounts/auth/" method="post">{% csrf_token %}
<label for="username">User name:</label>
<input type="text" name="username" value="" id="username">
<label for="password">Password:</label>
<input type="password" name="password" value="" id="password">
<input type='text' name="next" value="{{ request.GET.next }}">
<input type="submit" value="login">
</form>
{% endblock %}
设置
:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
url(r'^admin/', include(admin.site.urls)),
('^accounts/', include('userprofile.urls')),
url(r'^accounts/login/$', 'django_yunite.views.login'),
url(r'^accounts/auth/$', 'django_yunite.views.auth_view'),
url(r'^accounts/logout/$', 'django_yunite.views.logout'),
url(r'^accounts/loggedin/$', 'django_yunite.views.loggedin'),
url(r'^accounts/invalid/$', 'django_yunite.views.invalid_login'),
)
设置
:
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'debug_toolbar',
'userprofile',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ROOT_URLCONF = 'django_yunite.urls'
WSGI_APPLICATION = 'django_yunite.wsgi.application'
# Internationalization
# https://docs.djangoproject.com/en/1.6/topics/i18n/
LANGUAGE_CODE = 'en-ca'
TIME_ZONE = 'EST'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.6/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = (
('assets', '/home/user/GitHub/venv_yunite/django_yunite/static/'),
)
TEMPLATE_DIRS = (
'./templates',
'/article/templates',
)
STATIC_ROOT = "/home/user/Documents/static/"
AUTH_PROFILE_MODULE = 'userprofile.UserProfile'
打印语句显示一个空的u'next'
推荐答案
查询字符串被隐式传递给任何视图,无需您编写任何特殊代码.
The query string is implicitly passed to any view, without you having to write any special code.
您所要做的就是确保 next
键是从实际登录表单传递的(在您的情况下,这是在 /accounts/login/中呈现的表单)
),到 /accounts/auth
视图.
All you have to do is make sure that the next
key is passed from the actual login form (in your case, this is the form that is rendered in /accounts/login/
), to the /accounts/auth
view.
为此,您需要确保在设置中启用了请求模板上下文处理器 (django.core.context_processors.request
).为此,首先您需要为 TEMPLATE_CONTEXT_PROCESSORS
导入默认值,然后在您的 settings.py
中添加请求处理器,如下所示:
To do that, you need to make sure you have the request template context processor (django.core.context_processors.request
) enabled in your settings. To do this, first you need to import the default value for TEMPLATE_CONTEXT_PROCESSORS
, then add the request processor to it in your settings.py
, like this:
from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
"django.core.context_processors.request",
)
然后在表格中:
<form method="POST" action="/accounts/auth">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.GET.next }}" />
{{ login_form }}
<input type="submit">
</form>
现在,在您的 /accounts/auth
视图中:
Now, in your /accounts/auth
view:
def foo(request):
if request.method == 'POST':
# .. authenticate your user
# redirect to the value of next if it is entered, otherwise
# to /accounts/profile/
return redirect(request.POST.get('next','/accounts/profile/'))
这篇关于@login_required 后的 Django 重定向到下一个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!