覆盖Django allauth注册“下一个”重定向URL

15
假设用户在使用django-allauth的网站上访问页面/some_url/。当他们点击“登录”时,会被重定向到类似以下URL的页面:
/accounts/login/?next=/some_url/

如果他们已经是注册用户,在这里登录后,他们会被发送到/some_url/,这是可以的。
但是,如果他们尚未注册,并且点击了“注册”,则会被发送到:
/accounts/signup/?next=/some_url/

假设我想在用户注册后立即将其发送到某个入门体验页面,例如/onboarding/
最简单的方法是如何覆盖allauth的默认行为,并且无论是否指定了next=/some_url/,都将用户发送到/onboarding/
1个回答

19

最简单的方法是使用您自己的副本覆盖模板account/signup.html。如果您检查该模板,您将看到以下部分:

{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
{% endif %}

如果您删除if/endif部分并更改其中的值,则注册页面将重定向到特定页面,即使在URL中传递了next参数:

<input type="hidden" name="{{ redirect_field_name }}" value="/onboarding/" />

虽然不完全适用于我的情况,但这是一个好答案。在我的情况下,我担心并非所有用户都会在注册后立即登录。然后他们的URL可能仍然会得到“next”参数。我将使用中间件进行重定向,并使用计数器确保重定向只发生一次。是的,这是一个复杂的解决方案,但可以保证“/onboarding/”只被访问一次。 - ZZY
@Selcuk,这样做不是更好吗:value="{% url 'onboarding_urlname' %}" - unlockme
@unlockme 如果可能的话,那将是理想的。 - Selcuk
为什么不直接使用name="next"而不是name="{{ redirect_field_name }}",如果你想让该表单每次都发生重定向? - alpalalpal
2
@alpalalpal 因为 {{ redirect_field_name }} 通常是 next,但不一定是。例如,它可能已经被 login_required 装饰器更改了,如:@login_required(redirect_field_name='next_url') - Selcuk
+1 是为了 redirect_field_nameredirect_field_value。我没有意识到在默认的 allauth 登录视图中没有可用的 next 变量,因此我从 Django 的默认身份验证迁移过来的模板无法正常工作。 - Mihai Chelaru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接