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实例的
    参数

  • Django的内置视图应该为您处理这个问题,除非您需要特殊的逻辑。编写自己的视图没有什么错,但是Django提供了很多现成的功能,以减少您自己编写所需的代码量。内置视图还具有经过良好测试和通用性的优点


  • 我最后做的是以下几点。对我来说,这似乎有点像黑客的工作。有没有更好的方法使用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令牌、当前登录用户等)。我也在搜索这一点,您的答案对我有帮助。我认为这应该是正确的答案。