Django 在@login\u required之后获取下一步
由于某种未知原因,我当前无法从Django 在@login\u required之后获取下一步,django,django-forms,django-templates,Django,Django Forms,Django Templates,由于某种未知原因,我当前无法从@login\u required重定向中访问下一个值。我已经附加了login.html页面的代码和我的项目设置 输入name=nextvalue=',但它应该包含调试转储中显示的{{next}}中的值: GET data Variable Value u'next' [u'/accounts/profile/'] login.html: {% extends "base.html" %} {% block content %} {% if f
@login\u required
重定向中访问下一个
值。我已经附加了login.html页面的代码和我的项目设置
输入name=next
value='
,但它应该包含调试转储中显示的{{next}}
中的值:
GET data
Variable Value
u'next' [u'/accounts/profile/']
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="{{ next }}">
<input type="submit" value="login">
</form>
{% endblock %}
<input type="hidden" name="next" value="{{ next }}"/>
views.py
:
def login(request):
c={}
c.update(csrf(request))
return render_to_response('login.html', c)
尝试将
next
参数添加到上下文中
def login(request):
c = {'next' : request.GET.get('next', '/')}
return render(request, 'login.html', c)
这里有几个额外的注意事项:
render\u to\u响应
调用提供一个作为context\u实例的参数
我最后做的是以下几点。对我来说,这似乎有点像黑客的工作。有没有更好的方法使用csrf登录
视图
:
def login(request):
c={}
c.update(csrf(request))
if 'next' in request.GET:
c['next'] = request.GET.get('next')
return render_to_response('login.html', c)
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)
if request.POST.get('next') != '':
return HttpResponseRedirect(request.POST.get('next'))
else:
return HttpResponseRedirect('/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="{{ next }}">
<input type="submit" value="login">
</form>
{% endblock %}
<input type="hidden" name="next" value="{{ next }}"/>
这是使用您自己的登录视图,还是使用django.contrib.auth.views.login
?如果是前者,您是否将next
参数传递到您的上下文中?登录视图是我自己的,我将发布内置登录是否包含csrf的代码?@MattStokes是的,csrf保护由CsrfViewMiddleware处理。只要您在已安装的应用程序
和模板(u CONTEXT)处理器
设置中有了它设置,它就可以在使用RequestContext
呈现的任何模板中使用,并在点击视图之前由中间件进行处理。解释不同的使用方法。@MattStokes为了更清楚,我在回答中使用的render
函数会自动使用RequestContext
。这确保了所有的模板\上下文\处理器
功能都能够在呈现模板之前完成工作并向上下文中注入额外的数据(例如CSRF令牌、当前登录用户等)。我也在搜索这一点,您的答案对我有帮助。我认为这应该是正确的答案。