我正在尝试在成功登录后将用户重定向到自定义网址"/gallery/(username)/"
。它目前重定向到默认的"/account/profile/"
网址虽然我知道我可以覆盖我{{1}中的重定向网址我的网址是动态的,因此无法使用。
文档说明我需要使用settings.py
参数和"next"
我的模板中有context processors.
,但我对如何实际传递{{1}感到困惑}。任何帮助将不胜感激。
p.s:我正试图避免编写我自己的登录视图。
答案 0 :(得分:40)
Django的登录视图django.contrib.auth.views.login
接受名为extra_context
的字典。字典中的值直接传递给模板。因此,您可以使用它来设置next
参数。完成后,您可以设置名为next
和值{{ next }}
的隐藏字段,以便在模板中呈现。
答案 1 :(得分:20)
我承认我通常会使用2次重定向来获得这样的效果。
首先,制作您自己的registration/login.html
页面。您可以在authentication docs的此部分中复制并粘贴html示例,以使该过程更容易一些。但是,不要使用上下文中的动态'{{ next }}
变量,而是将下一个值硬连接到登录用户的通用着陆视图
<input type="submit" value="login" />
<input type="hidden" name="next" value="/gallery/" />
然后,在您映射到/gallery/
URL的视图中,从请求中提取User对象(因为用户现在将登录,特别是如果库视图包含在{{1}中}或@permission_required
装饰器。使用该视图重定向到相应的用户特定图库页面:
@login_required
答案 2 :(得分:7)
如果您已拥有登录表单的自定义模板,则需要在<form>
标记内添加以下内容:
<input type="hidden" name="next" value="{{next}}" />
顺便说一句,您不必创建自己的登录视图。 django.contrib.auth.views.login工作正常。您只需要为其创建模板(registration/login.html
)
答案 3 :(得分:5)
成为django的新手并且在这个有点老的线程上磕磕绊绊我找到了动态问题的不同解决方案(=仅在需要时覆盖自定义默认值)设置我想要分享的下一个参数(工作正常与django 1.5,早期版本未经测试):
正如django-d我想要避免重复和自定义登录视图,所以我使用股票django.contrib.auth.views.login
- 视图添加
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html',}, name='login'),
到我的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 }}" />
我的理解遵循视图中url-configurations的解耦实践。 所以对于应该重定向到我的应用程序登录的视图,然后转到非默认视图 我用
return HttpResponseRedirect('%s?next=%s' % (reverse('login'), reverse('mycustomnext')) )
从我希望用户登录的视图中。我使用它来返回我停止记录用户的视图。
答案 4 :(得分:2)
您可以使用静态重定向到/loggedin/
,然后将该网址关联到一个能够进行正确重定向的视图。
登录需要额外的一步,但如果您想使用django的视图,它就可以完成这项工作。
答案 5 :(得分:0)
使用自己的网址创建自己的登录视图,不要使用管理员的视图。 您可以将下一页存储在会话中,或将其作为GET参数传递给登录视图 (即/ login?next = gallery)只是不要忘记在重定向到它之前清理并验证该值。