"next"参数,redirect,django.contrib.auth.login

dja*_*o-d 27 python django django-forms

我正在尝试"/gallery/(username)/"在成功登录后将用户重定向到自定义网址.它目前重定向到默认"/account/profile/"网址虽然我知道我可以覆盖我的重定向网址settings.py,但我的网址是动态的,因此无法使用.

文档声明我需要使用"next"参数,context processors.{{next}}在模板中有,但我对如何实际传递它感到困惑"/gallery/(username)".任何帮助将不胜感激.

ps:我正试图避免编写我自己的登录视图.

Gur*_*sad 41

Django的登录视图django.contrib.auth.views.login接受一个名为的字典extra_context.字典中的值直接传递给模板.所以你可以用它来设置next参数.完成后,您可以设置一个带有名称next和值的隐藏字段,{{ next }}以便在模板中呈现它.

  • 伙计,你摇滚!你应该是接受的答案.投票! (2认同)

Jar*_*die 20

我承认我通常使用2次重定向以获得这样的功能.

首先,制作自己的registration/login.html页面.您可以在身份验证文档的此部分中复制并粘贴html示例,以使该过程更容易一些.但是,不是使用'{{ next }}上下文中的动态变量,而是将下一个的值硬连接到登录用户的通用登录视图

<input type="submit" value="login" />
<input type="hidden" name="next" value="/gallery/" />
Run Code Online (Sandbox Code Playgroud)

然后,在映射到/gallery/URL 的视图中,从请求中提取User对象(因为用户现在将登录,特别是如果库视图包含在装饰器中@permission_required或者@login_required装饰器中.使用该视图重定向到适当的用户特定的画廊页面:

@login_required
def gallery(request):
    url = '/gallery/%s/' % request.user.username
    return HttpResponseRedirect(url)
Run Code Online (Sandbox Code Playgroud)

  • 我会说这是一个“重定向”而不是两个,它在画廊视图中运行。好的。 (3认同)

And*_*eev 8

如果您已拥有登录表单的自定义模板,则需要在<form>标记内添加以下内容:

<input type="hidden" name="next" value="{{next}}" />
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您不必创建自己的登录视图.django.contrib.auth.views.login工作正常.你只需要为它创建一个模板(registration/login.html)


ant*_*lex 5

作为django的新手并且在这个有点老的线程上磕磕绊绊我找到了动态问题的不同解决方案(=仅在需要时覆盖自定义默认值)设置我想要分享的下一个参数(与django 1.5一起正常工作) ,早期版本未经测试):

就像django-d我想要避免重复和自定义登录视图,所以我使用stock django.contrib.auth.views.login-view添加行

url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html',}, name='login'),
Run Code Online (Sandbox Code Playgroud)

到我的urls.py和login.html-templates表单元素:

{% if not next or not next.strip %}
  {# avoid django.contrib.auth.views.login s default of /account/profile/ #}
  {% url 'afterlogindefaultview' as next %}
{% endif %}
<input type="hidden" name="next" value="{{ next }}" />
Run Code Online (Sandbox Code Playgroud)

根据我的理解,遵循视图中url-configurations的解耦实践.所以对于应该重定向到我的应用程序登录的视图,然后前往我使用的非默认视图

return HttpResponseRedirect('%s?next=%s' % (reverse('login'), reverse('mycustomnext')) )
Run Code Online (Sandbox Code Playgroud)

从我希望让用户登录的视图中.我使用它来返回到我停止记录用户的视图.